正则表达式代码不起作用

时间:2012-04-02 17:01:34

标签: php regex

我正在尝试使用正则表达式来查找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);

但我一无所获......

有什么问题? 谢谢!

1 个答案:

答案 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
';