Php,Regex,在字符串之间

时间:2013-12-07 22:24:37

标签: php regex

我试图找到以下场景的模式:

假设我有这个字符串:

  

someString [code] some code [/ code] someString

现在一些代码可以是任何东西,我想要的是保留字(break,class等),所以对于真实场景,这是一个字符串:

someString
[code]
class someClass{}
[/code]
someString

// And again

someString
[code]
class someClass{}
[/code]
someString

所以我想要了解的是如何匹配所有 [code] [/ code] 标签之间的所有保留字。

例如:[code]someReservedWord some text anotherReservedWord[/code] 我只想匹配someReservedWord和anotherReservedWord

我正在考虑使用 preg_match_all 所以我可以在每个[code] [/ code]中获取所有保留字,并使用 PREG_OFFSET_CAPTURE 来获取他们的位置,

唯一我无法弄清楚的是模式,如果有人有想法我将非常感谢,谢谢大家,祝你有愉快的一天。

2 个答案:

答案 0 :(得分:3)

您可以使用:

$pattern = <<<'LOD'
~ (?(DEFINE) (?<words> class | string | function ) )

(?: \[code] | \G(?<!^) )
(?: [^[]+? | \[(?!/code]) )*? \K
\b \g<words> \b

~x
LOD;

preg_match_all($pattern, $subject, $matches, PREG_OFFSET_CAPTURE);

print_r($matches[0]);

模式细节:

首先,我们定义一个包含所有保留字的命名组:

(?(DEFINE) (?<words> class | string | function ) )

(?(DEFINE)...)语法允许从模式本身定义子模式。您可以使用\g<words>在模式中稍后调用命名组“单词”。

(?: [^[]+? | \[(?!/code]) )*?描述保留字之前的所有内容。此子模式可以匹配除结束标记[/code]之外的所有子模式,因为您可以选择“所有不是[”或“a [未跟/code”)。由于它可以匹配所有,因此在遇到保留字时,使用延迟量词来停止匹配。

模式的切入点是(?: \[code] | \G(?<!^) )。这会强制匹配以[code]标记开头或与先前匹配相邻。

\G是一个锚,意思是:“在字符串的开头或与先前的匹配相邻”。使用负向的后视(?<!^),你禁止字符串的开头的。)

\K是一种技巧,可以从匹配结果中重置所有匹配的内容。

答案 1 :(得分:0)

$str = "someString[code]some code[/code]someString";
$ret = preg_replace('#\[code\](.+)\[\/code\]#iUs', '<FOUND>$1</FOUND>', $str);
var_dump($ret);

http://www.phpliveregex.com/p/2tD,请参阅preg_match_all示例)

你可能会谷歌搜索BB-Code PHP正则表达式。