PHP正则表达式问题
我正在尝试解析一些文本,例如:PHP正则表达式问题,php,regex,Php,Regex,我正在尝试解析一些文本,例如: $text = "Blah blah [a]findme[/a] and [b]findmetoo[b], maybe also [z]me[/z]."; 我现在得到的是: preg_match_all("/[*?](.*?)[\/*?]/", $text, $matches); 不幸的是,这不起作用 你知道如何解析、返回节点键和相应的节点值吗?首先,你没有在*?周围放置(),你没有匹配标记名,其次,使用[*?]将匹配多个[,直到]你想要匹配的地方,所以你应该
$text = "Blah blah [a]findme[/a] and [b]findmetoo[b], maybe also [z]me[/z].";
我现在得到的是:
preg_match_all("/[*?](.*?)[\/*?]/", $text, $matches);
不幸的是,这不起作用
你知道如何解析、返回节点键和相应的节点值吗?首先,你没有在
*?
周围放置()
,你没有匹配标记名,其次,使用[*?]
将匹配多个[
,直到]
你想要匹配的地方,所以你应该做[(.*?)]
和[\/(.*?)]
您必须尝试以下几点:
/\[(.*?)\](.*?)\[\/(.*?)\]/is
这并不能保证有效,但会让你离得更近
你也可以这样做:
/\[(.*?)\](.*?)\[\/\1\]/is
然后递归foreach result循环,直到preg_match_all返回false,这是一种可能的嵌套方法。尝试:
$pattern = "/\[a\](.*?)\[\/a\]/";
$text = "Blah blah [a]findme[/a] and [b]findmetoo[b], maybe also [z]me[/z].";
preg_match_all($pattern, $text, $matches);
这将为您指明正确的方向。您可以尝试以下方法:
preg_match_all("/\[(.*?)\](.*?)\[\/?.*?\]/", $text, $matches);
所作的修改:
和[
是正则表达式元字符 用于定义字符类。到 匹配您需要的文字]
和[
逃离他们]
- 匹配任意文本(不带
换行符)以非贪婪的方式使用
*?
- 要匹配节点密钥,需要
将与之匹配的图案括起来
以便捕获它们(…)
(\[\\/]\])。+?(\[\/[^\/]\])
。希望对你有用我不是正则表达式猴子,但我认为你需要避开这些括号并创建要搜索的组,因为括号不会返回结果(括号会返回结果):
希望这能奏效 为了匹配相同的标记,您需要一个反向引用: 这假设没有嵌套,如果您需要嵌套,请告诉我
$matches = array();
if (preg_match_all('#\[([^\]]+)\](.+?)\[/\1\]#', $text, $matches)) {
// $matches[0] - entire matched section
// $matches[1] - keys
// $matches[2] - values
}
顺便说一句,我不知道您将如何处理这种bbcode样式的工作,但通常您希望使用类似于上述的regexp来处理此类文本的内联修改。即使[b]“标记”没有用[\b]反斜杠“b”关闭,您的第二个示例是否也应该被捕获。如果标签应正确关闭,则使用
/\[(.*?)\](.*?)\[\/\1\]/
这将确保开始标记和结束标记匹配。键可以包含哪些值,
值可以包含键/值吗?我想你应该把$text=“Blah Blah[a]findme[/a]和[b]findmeto[/b]放进去,也许还有[z]me[/z]”;与其说[a]findme[/a]和[b]findmeto[b],还不如说[z]me[/z]`
/\[(.*?)\](.*?)\[\/\1\]/