繁体   English   中英

挣扎与PHP正则表达式

[英]Struggling with php regex

我在想像一个preg_match_all()调用非常简单的正则表达式正在挣扎。 我希望模仿Wikimedia样式的内部链接系统,该系统会将类似[[link]]的内容转换为链接。

我正在寻找一个正则表达式,它将在字符串中搜索[[foobar]]的任何示例并将“ foobar”返回给我。 foob​​ar应该真的很疯狂。

我尝试了以下方法:

<?php
 $content = "Lorem ipsum dolor [[sit]] amet, consectetur adipiscing [[elit]].";
 $links = preg_match_all("[[*]]",$content,$matches);
 print_r($matches);
?>

我什么都没得到。 任何帮助,将不胜感激。

*单独并不意味着任何事情。 这是一个量词,它需要与其他内容结合在一起。 在这种情况下,一个点. 会做(意味着“任何事情”)。 另外,您可以使用懒惰的量词而不是贪婪的量词在遇到]]立即停止。
所以...

$links = preg_match_all("/\[\[(.*?)]]/",$content,$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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM