我试图找到以下场景的模式:
假设我有这个字符串:
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 来获取他们的位置,
唯一我无法弄清楚的是模式,如果有人有想法我将非常感谢,谢谢大家,祝你有愉快的一天。
答案 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正则表达式。