[英]Struggling with php regex
我在想像一个preg_match_all()调用非常简单的正则表达式正在挣扎。 我希望模仿Wikimedia样式的内部链接系统,该系统会将类似[[link]]的内容转换为链接。
我正在寻找一个正则表达式,它将在字符串中搜索[[foobar]]的任何示例并将“ foobar”返回给我。 foobar应该真的很疯狂。
我尝试了以下方法:
<?php
$content = "Lorem ipsum dolor [[sit]] amet, consectetur adipiscing [[elit]].";
$links = preg_match_all("[[*]]",$content,$matches);
print_r($matches);
?>
我什么都没得到。 任何帮助,将不胜感激。
preg_match_all("/\[\[([^\]]*?)\]\]/i",$content,$matches);
使用以下模式/\\[\\[(.*)\\]\\]/U
:
$content = "Lorem ipsum dolor [[sit]] amet, consectetur adipiscing [[elit]].";
$links = preg_match_all("/\[\[(.*)\]\]/U",$content,$matches);
print_r($matches);
说明。 正则表达式需要以/
作为分隔符开始和结束。 方括号[
必须在\\[
等正则表达式中转义。 方括号之间的内容必须在捕获组(.*)
。 最后,用U
来表示ungreedy修饰符,以确保仅捕获最近的方括号之间的内容。 (删除以查看其功能)
您需要转义[
作为\\[
,然后将整个表达式与不贪心的标记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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.