我正在努力解决preg_match_all()调用我想象的非常简单的正则表达式。我正在寻找模仿维基媒体风格的内部链接系统,它将这样的[[link]]变成一个链接。
我正在寻找一个正则表达式,它将搜索字符串以查找[[foobar]]的任何示例并将“foobar”返回给我。 foobar应该是狂野的。
我尝试了以下内容:
<?php
$content = "Lorem ipsum dolor [[sit]] amet, consectetur adipiscing [[elit]].";
$links = preg_match_all("[[*]]",$content,$matches);
print_r($matches);
?>
我没有得到任何东西。任何帮助将不胜感激。
答案 0 :(得分:4)
*
并不意味着什么。这是一个量词,它需要与其他东西。在这种情况下,点.
会(意味着“任何东西”)。此外,只要遇到]]
,就可以使用lazy quantifiers代替贪婪的人来停止。$links = preg_match_all("/\[\[(.*?)]]/",$content,$matches);
修改强>
您必须转义[
,因为它们标记了character classes的开头。
答案 1 :(得分:2)
preg_match_all("/\[\[([^\]]*?)\]\]/i",$content,$matches);
答案 2 :(得分:1)
使用以下模式/\[\[(.*)\]\]/U
:
$content = "Lorem ipsum dolor [[sit]] amet, consectetur adipiscing [[elit]].";
$links = preg_match_all("/\[\[(.*)\]\]/U",$content,$matches);
print_r($matches);
解释。正则表达式需要以/
的分隔符开始和结束。方括号[
必须在\[
等正则表达式中进行转义。括号内的内容必须位于捕获组(.*)
内。最后使用了ungreedy修饰符U
来确保只捕获最近括号之间的内容。 (删除以查看其功能)
答案 3 :(得分:1)
您需要将[
转义为\[
,然后将整体表达式与非贪婪标记U
匹配。
$content = "Lorem ipsum dolor [[sit]] amet, consectetur adipiscing [[elit]].";
$links = preg_match_all("/\[\[(.*)]]/U",$content,$matches);
print_r($matches);
Array(
[0] => Array (
[0] => [[sit]]
[1] => [[elit]]
)
[1] => Array (
[0] => sit
[1] => elit
)
)
编辑:用户ridgerunner指出使用/U
修饰符被认为是不好的做法,因为它会使所有匹配的量词变得贪婪,包括不合理的量词。建议的匹配代码是(.*?)
,而不是上面发布的代码,它会产生相同的等效答案。
$links = preg_match_all("/\[\[(.*?)]]/",$content,$matches);