我无法通过preg_match_all从href值中获取一部分

时间:2014-01-30 18:44:13

标签: preg-match-all

有没有办法从href值中提取部分? 例如我的代码是:

$searchfrom = '@<a class="uye" href="index.php?profil=12" contenteditable="false">@';
$search = '@<a class="uye" href="index.php?profil=(.*?)" contenteditable="false">@';
preg_match_all($search,$searchfrom,$sonuc); 

我想从searchfrom变量中提取12个。

1 个答案:

答案 0 :(得分:0)

你犯了3个错误,但你的模式只有一个原因不起作用。

如何在模式中编写文字字符串?

?是正则表达式中的特殊字符,表示可选(在字符之后)或将量词变为惰性(在+之后,*?{n,m})或是多个功能(非捕获或原子组,条件,递归,定义)的语法的一部分。
如果要在模式中将其写为文字,则必须将其转义:

php?profil => php\?profil

这是您的模式不起作用的唯一原因。

与文字点相同。 .具有特殊含义,必须转义:

index.php => index\.php

但由于.表示所有字符,因此它也与字面点匹配。

必须在模式中转义十二个特殊字符才能用作文字:

[ ( ) { ? * + ^ $ \ | .

请注意,当开头大括号{后面跟不是2,5},5}2,}时,情况并不明确(即开头的花括号不是{n,m}量词的开头。)而且你不需要逃避它。

但是必须转义其他字符:模式分隔符。

使用PHP,您必须使用模式分隔符来包围模式,最常用的是斜杠/,但您可以使用其他字符,例如~ # @ ... (请注意,使用正则表达式特殊字符或在模式中多次用作文字的字符是一个坏主意。)

您似乎忘记了分隔符,因为@是原始字符串的一部分。在模式中,@被视为分隔符,因为它是第一个字符,但它不被视为文字@。如果你想匹配@,你必须用分隔符包围你的模式。

所以,正确的模式是:

$search = '/@<a class="uye" href="index\.php\?profil=(.*?)" contenteditable="false">@/';

如果您想避免搜索和转义文字字符串中的每个特殊字符,可以将文字字符串括在\Q....\E之间:

$search = '/\Q@<a class="uye" href="index.php?profil=\E(.*?)\Q" contenteditable="false">@\E/';

(模式分隔符(如果存在)必须始终进行转义。)

或者您可以使用preg_quote()功能:

$search = '/' . preg_quote('@<a class="uye" href="index.php?profil=', '/') . '(.*?)' . preg_quote('" contenteditable="false">@', '/') .'/';

preg_quote()的第二个(可选)参数是分隔符。我写了它,但默认为/