与php正则表达式抗争
我正在努力解决的问题是,对于preg_match_all()调用,我想象的是一个非常简单的正则表达式。我希望模仿维基媒体风格的内部链接系统,将类似于[[link]]的东西变成链接 我正在寻找一个正则表达式,它将在字符串中搜索[[foobar]]的任何示例,并将“foobar”返回给我。foobar真的应该很疯狂 我尝试了以下方法:与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
<?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很公平。虽然我认为懒惰的量词会使正则表达式比使用负字符类更有效。但是懒惰的量词会使正则表达式更有效