我正在尝试使用正则表达式来查找FINDTHIS:
bla bla the link:<a href="http://www.exemple.net/index.php?p…
我的代码是:
$delimiter = '#';
$startTag = '<a href="http://www.exemple.net/index.php?p…'; // shortened
$endTag = '/1/">';
$regex = $delimiter . preg_quote($startTag, $delimiter)
. '(.*?)'
. preg_quote($endTag, $delimiter)
. $delimiter
. 's';
preg_match($regex,$result,$matches);
$category = $matches;
print_r($category);
但我一无所获......
有什么问题? 谢谢!
答案 0 :(得分:2)
不确定我是否正确阅读,但下面的内容与我认为您尝试的内容相当。值得注意的是正则表达式和HTML可能不会混合。但对于HTML文本块,它应该没问题。
当想要在标签中找到特定的att-val时,我倾向于支持在标签内的任何位置找到它的前瞻,并且足够安全以至于不会超出边界。
使用preg_match_all()作为示例。这里的测试用例http://ideone.com/oerbc
(固定相对反射,应为-2)
$html = '
<a href="http://www.exemple.net/index.php?p[some stuff to find]/1/">
<a href=\'http://www.exemple.net/index.php?p[more stuff to find]/1/ \'>
';
$ref_txtstart = 'http://www.exemple.net/index.php?p';
$ref_txtend = '/1/';
$regex =
'~
<a
(?=\s)
(?= (?:[^>"\']|"[^"]*"|\'[^\']*\')*? (?<=\s) href \s*=
(?>
\s* ([\'"]) \s*
' . preg_quote($ref_txtstart) . '
(?<core>(?:(?!\g{-2}).)*)
' . preg_quote($ref_txtend) . '
\s* \g{-2}
)
)
\s+ (?:".*?"|\'.*?\'|[^>]*?)+
>~xs
';
echo ("$regex\n");
preg_match_all( $regex, $html, $matches, PREG_SET_ORDER );
foreach ($matches as $val) {
echo( "matched = $val[0]\ncore = $val[core]\n\n" );
}
?>
输出
~
<a
(?=\s)
(?= (?:[^>"']|"[^"]*"|'[^']*')*? (?<=\s) href \s*=
(?>
\s* (['"]) \s*
http\://www\.exemple\.net/index\.php\?p
(?<core>(?:(?!\g{-2}).)*)
/1/
\s* \g{-2}
)
)
\s+ (?:".*?"|'.*?'|[^>]*?)+
>~xs
matched = <a href="http://www.exemple.net/index.php?p[some stuff to find]/1/">
core = [some stuff to find]
matched = <a href='http://www.exemple.net/index.php?p[more stuff to find]/1/ '>
core = [more stuff to find]
也
通过使用分支重置和
,可以扩展为包括未加引号的值
将命名捕获缓冲区更改为相关捕获缓冲区的固定索引。
因此$val[core]
变为$val[2]
。示例在这里http://ideone.com/IHHLg
扩展正则表达式
$regex =
'~
<a
(?=\s)
(?= (?:[^>"\']|"[^"]*"|\'[^\']*\')*? (?<=\s) href \s*=
(?|
(?>
\s* ([\'"]) \s*
' . preg_quote($ref_txtstart) . ' ((?:(?!\g{-2}).)*) ' . preg_quote($ref_txtend) . '
\s* \g{-2}
)
|
(?>
(?!\s*[\'"]) \s* ()
' . preg_quote($ref_txtstart) . ' ([^\s>]*) ' . preg_quote($ref_txtend) . '
(?=\s|>)
)
)
)
\s+ (?:".*?"|\'.*?\'|[^>]*?)+
>~xs
';