PHP正则表达式问题

时间:2010-12-06 15:12:03

标签: php regex

我正在尝试解析一些文本,例如:

$text = "Blah blah [a]findme[/a] and [b]findmetoo[b], maybe also [z]me[/z].";

我现在拥有的是:

preg_match_all("/[*?](.*?)[\/*?]/", $text, $matches);

不幸的是,这不起作用。

任何想法如何解析,返回节点密钥和相应的节点值?

7 个答案:

答案 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);

See it

所做的更改:

  • []是正则表达式元字符 用于定义字符类。至 匹配您需要的文字[] 逃避他们。
  • 匹配任意文本(没有 新线)你用非贪心的方式 .*?
  • 匹配您需要的节点密钥 用它来匹配匹配的模式 (..)以便捕获它们。

答案 4 :(得分:0)

我想出了这个正则表达式((\[[^\/]\]).+?(\[\/[^\/]\]))。希望对你有用

答案 5 :(得分:0)

我不是正则表达式的猴子,但我认为你需要逃避这些括号并创建要搜索的组,因为括号不会返回结果(圆括号):

preg_match_all("/\\[(*?)\\](.*?)\\[\(\/*?)\\]/", $text, $matches);

希望这有效!

答案 6 :(得分:0)

即使[b]“标签”没有用[\ b]反斜杠'b'关闭,你的第二个例子也会被捕获。如果标签应正确关闭,请使用

/\[(.*?)\](.*?)\[\/\1\]/

这将确保开始和结束标签匹配。