2012-02-03 70 views
1

我试图找到它看起来像这样的字符串中的所有简码:正则表达式与WordPress的简

 [a_col] One 

 [/a_col] 

outside 
[b_col] 

Two 

[/b_col] [c_col] Three [/c_col] 

我需要从山坳的内容(例如“三”)和字母(A, b或C) 下面是我使用

preg_match_all('#\[(a|b|c)_col\](.*)\[\/\1_col\]#m', $string, $hits); 

表达,但$命中只包含最后一个。

内容可以有任何字符,甚至“[”或“]”

编辑:

我想获得“外”,以及它可以是任何字符串(除了这些的cols) 。我该如何处理这个问题,还是应该在第二步中解析这个问题?

+2

WordPress已经有了一个功能,你不需要重新发明轮子。我敢打赌,它比任何建议的答案都更好,因为wordpress知道短代码是什么,什么不是 - 以及封装代码的处理顺序。保重。 – hakre 2012-02-03 10:45:50

+0

非常真实,我计划尝试重构我的插件以尽可能在短代码中使用构建,但不幸的是,我的插件需要将短代码从帖子中提取出来,然后将其格式化,然后将其重新放入,并且必须发生这种情况按照设定的顺序。希望我找出一种方法,但现在我手动执行。 – 2012-02-03 10:47:52

+0

同意,但这是一个自定义编辑器,我需要这种方式 – Xaver 2012-02-03 10:50:42

回答

2

这将捕获内容中的任何内容以及属性,并允许内容中的任何字符。

<?php 

$input = '[a_col some="thing"] One[/a_col] 
[b_col] Two [/b_col] 
[c_col] [Three] [/c_col] '; 

preg_match_all('#\[(a|b|c)_col([^\[]*)\](.*?)\[\/\1_col\]#msi', $input, $matches); 

print_r($matches); 

?> 

编辑:

您可能需要再修剪一下比赛,因为它似乎可能会有一些空白。另外,您也可以使用正则表达式的内容删除空格:

preg_match_all('#\[(a|b|c)_col([^\[]*)\]\s*(.*?)\s*\[\/\1_col\]#msi', $input, $matches); 

OUTPUT:

Array 
(
    [0] => Array 
     (
      [0] => [a_col some="thing"] One[/a_col] 
      [1] => [b_col] Two [/b_col] 
      [2] => [c_col] [Three] [/c_col] 
     ) 

    [1] => Array 
     (
      [0] => a 
      [1] => b 
      [2] => c 
     ) 

    [2] => Array 
     (
      [0] => some="thing" 
      [1] => 
      [2] => 
     ) 

    [3] => Array 
     (
      [0] => One 
      [1] => Two 
      [2] => [Three] 
     ) 

) 

它也可能会有所帮助使用此捕获存储在$matches[2]属性名称和值。考虑$atts$matches[2]中的第一个元素。当然,将迭代属性数组并在每个属性上执行此操作。

preg_match_all('#([^="\'\s]+)[\t ]*=[\t ]*("|\')(.*?)\2#', $atts, $att_matches); 

这给出其中名称存储在$att_matches[1]和它们相应的值被存储在$att_matches[3]阵列。

+1

谢谢,这完全符合我的需要。此外,它的属性准备 – Xaver 2012-02-03 10:35:46

+0

我添加了一些属性信息 – 2012-02-03 10:45:15

1

的使用((.|\n)*)(.*),而不是捕捉到多行...

<?php 
$string = " 
[a_col] One 

[/a_col] 
[b_col] 

Two 

[/b_col] [c_col] Three [/c_col]"; 
    preg_match_all('#\[(a|b|c)_col\]((.|\n)*)\[\/\1_col\]#m', $string, $hits); 

    echo "<textarea style='width:90%;height:90%;'>"; 
    print_r($hits); 
    echo "</textarea>"; 
?> 
+0

谢谢你!按预期工作,但我会用@AramKocharyan的解决方案去解决 – Xaver 2012-02-03 10:37:18

+0

是的,他的回答非常彻底!甚至预见未来可能出现的问题。我会和他的回答一起去:-) – 2012-02-05 15:08:29

0

我没有一个环境,我可以在这里测试,但你可以使用后面一看,向前看断言和一个反向引用以匹配内容周围的标签。像这样的东西。

(?<=\[(\w)\]).*(?=\[\/\1\])