Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP正则表达式问题_Php_Regex - Fatal编程技术网

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\]/