Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.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_Preg Match All - Fatal编程技术网

与php正则表达式抗争

与php正则表达式抗争,php,regex,preg-match-all,Php,Regex,Preg Match All,我正在努力解决的问题是,对于preg_match_all()调用,我想象的是一个非常简单的正则表达式。我希望模仿维基媒体风格的内部链接系统,将类似于[[link]]的东西变成链接 我正在寻找一个正则表达式,它将在字符串中搜索[[foobar]]的任何示例,并将“foobar”返回给我。foobar真的应该很疯狂 我尝试了以下方法: <?php $content = "Lorem ipsum dolor [[sit]] amet, consectetur adipiscing [[elit

我正在努力解决的问题是,对于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);
?>


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

*
本身并不意味着什么。这是一个量词,它需要和其他东西在一起。在这种情况下,点
就可以了(表示“任何东西”)。此外,当您遇到
]

所以

编辑:

你必须避开
[
,因为它们标志着你的开始。

*
本身并不意味着任何东西。它是一个量词,它需要与其他东西在一起。在这种情况下,点
就可以(意味着“任何东西”)。此外,你可以使用点而不是贪婪的点,在你遇到
]]时立即停止。

所以

编辑:

您必须转义
[
,因为它们标记了的开头。

使用以下模式
/\[\[(.*)\]\]\]/U

$content = "Lorem ipsum dolor [[sit]] amet, consectetur adipiscing [[elit]].";
$links = preg_match_all("/\[\[(.*)\]\]/U",$content,$matches);
print_r($matches);

解释。正则表达式需要以一个分隔符开始和结束,其分隔符为
/
。方括号
[
必须在类似
\[
的正则表达式中转义。括号之间的内容必须在捕获组
(*)内
。最后使用ungreedy修饰符
U
,以确保仅捕获最近括号之间的内容。(删除以查看其功能)

使用以下模式
/\[\[(.*)\]\]/U

$content = "Lorem ipsum dolor [[sit]] amet, consectetur adipiscing [[elit]].";
$links = preg_match_all("/\[\[(.*)\]\]/U",$content,$matches);
print_r($matches);

解释。正则表达式需要以一个分隔符开始和结束,其分隔符为
/
。方括号
[
必须在类似
\[
的正则表达式中转义。括号之间的内容必须在捕获组
(*)内
。最后使用ungreedy修饰符
U
,以确保仅捕获最近括号之间的内容。(删除以查看其功能)

您需要将
[/code>转义为
\[/code>,然后将整个表达式与非贪婪标志
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
    )
)
EDIT:用户ridgerunner指出,使用
/U
修饰符被认为是一种不好的做法,因为它会使所有匹配的量词(包括不灵活的量词)变得贪婪。建议的匹配代码是
(.*)
,而不是上面发布的内容,并且它会生成相同的等价答案

$links = preg_match_all("/\[\[(.*?)]]/",$content,$matches);

您需要将
[
转义为
\[
,然后将整个表达式与非贪婪标志
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
    )
)
EDIT:用户ridgerunner指出,使用
/U
修饰符被认为是一种不好的做法,因为它会使所有匹配的量词(包括不灵活的量词)变得贪婪。建议的匹配代码是
(.*)
,而不是上面发布的内容,并且它会生成相同的等价答案

$links = preg_match_all("/\[\[(.*?)]]/",$content,$matches);


谢谢你,我不能再接受10分钟,只是倒计时。谢谢你的礼貌。干杯!永远不要使用U旗!最佳做法是总是在正则表达式中的量词本身上使用
ungreedy修饰符。从来没有需要“U”修饰符的情况,它的唯一用途是确认使用。我很少对答案投反对票,但在修正之前,我会对这个答案投反对票。(修正后,我将删除我的反对票)我回答这个问题的目的是为了说明这个家伙最近犯了什么错误,而不是指出他什么时候犯了一个战略错误。感谢你的解释,尊重你的反对票,但我不会被威胁去改变答案。你知道吗,“U”标志也会让不吉利的量词变得贪婪?对不平凡的正则表达式贪婪(混合了贪婪和不友好的量词),“U”标志只会让事情变得非常混乱(并且容易出现错误).但是不要相信我的话,去读《掌握正则表达式》第三版吧。谢谢你,我不能再接受10分钟,只是倒数计时。谢谢你的礼貌。干杯!永远不要使用U旗!最好的做法是在正则表达式中的量词本身上始终使用
ungreedy修饰符。从来没有需要使用“U”修饰符的情况,其唯一作用是混淆。我很少对答案投反对票,但在这一问题解决之前,我会对这个答案投反对票。(解决它,我将删除我的反对票)我回答这个问题的目的是为了说明这个家伙最近犯了什么错误,而不是指出他什么时候犯了一个战略错误。感谢你的解释,尊重你的反对票,但我不会被威胁去改变答案。你知道吗,“U”标志也会让不吉利的量词变得贪婪?对不平凡的正则表达式贪婪(混合了贪婪和不友好的量词),“U”标志只会让事情变得非常混乱(并且容易出现错误).但不要相信我的话,去读《掌握正则表达式》第三版。带有负数字符集的所有格量词比惰性量词更合适。感谢您提供有关方法的额外信息。效果很好。
的+1。但请注意@Jackscomment@Jack很公平。虽然我认为懒惰的量词将使正则表达式比使用负字符类更有效。惰性量词会进行回溯,因此除非必要,否则不应使用它。具有负字符集的所有格量词比惰性量词更合适。感谢提供有关方法的额外信息。效果很好。
使用+1。但请注意@Jackscomment@Jack很公平。虽然我认为懒惰的量词会使正则表达式比使用负字符类更有效。但是懒惰的量词会使正则表达式更有效