我正在尝试解析一些文本,例如:
$text = "Blah blah [a]findme[/a] and [b]findmetoo[b], maybe also [z]me[/z].";
我现在拥有的是:
preg_match_all("/[*?](.*?)[\/*?]/", $text, $matches);
不幸的是,这不起作用。
任何想法如何解析,返回节点密钥和相应的节点值?
答案 0 :(得分:1)
首先,您不要将()
放在*?
与标记名称不匹配的位置,其次,使用[*?]
将匹配多个[
,直到{{1}你想在里面匹配的地方,所以你应该做]
和[(.*?)]
你必须尝试以下方面:
[\/(.*?)]
这不能保证有效,但会让你更近。
您也可以这样做:
/\[(.*?)\](.*?)\[\/(.*?)\]/is
然后递归foreach结果循环直到preg_match_all返回false,这是一种可能的嵌套方式。
答案 1 :(得分:1)
为了匹配相同的标签,您需要一个反向引用:
假设没有嵌套,如果你需要嵌套,请告诉我。
$matches = array();
if (preg_match_all('#\[([^\]]+)\](.+?)\[/\1\]#', $text, $matches)) {
// $matches[0] - entire matched section
// $matches[1] - keys
// $matches[2] - values
}
顺便说一句,我不知道你将如何处理这个bbcode风格的工作,但通常你会想要使用preg_replace_callback()来处理这种文本的内联修改,其正则表达式类似于上方。
答案 2 :(得分:0)
尝试:
$pattern = "/\[a\](.*?)\[\/a\]/";
$text = "Blah blah [a]findme[/a] and [b]findmetoo[b], maybe also [z]me[/z].";
preg_match_all($pattern, $text, $matches);
这应该指向正确的方向。
答案 3 :(得分:0)
你可以试试这个:
preg_match_all("/\[(.*?)\](.*?)\[\/?.*?\]/", $text, $matches);
所做的更改:
[
和]
是正则表达式元字符
用于定义字符类。至
匹配您需要的文字[
和]
逃避他们。.*?
。(..)
以便捕获它们。答案 4 :(得分:0)
我想出了这个正则表达式((\[[^\/]\]).+?(\[\/[^\/]\]))
。希望对你有用
答案 5 :(得分:0)
我不是正则表达式的猴子,但我认为你需要逃避这些括号并创建要搜索的组,因为括号不会返回结果(圆括号):
preg_match_all("/\\[(*?)\\](.*?)\\[\(\/*?)\\]/", $text, $matches);
希望这有效!
答案 6 :(得分:0)
即使[b]“标签”没有用[\ b]反斜杠'b'关闭,你的第二个例子也会被捕获。如果标签应正确关闭,请使用
/\[(.*?)\](.*?)\[\/\1\]/
这将确保开始和结束标签匹配。