-2

所以这是我正在抓取的 html 内容的一部分:

<div class="sms-separator"></div>
<div class="wallpaper-ads-right">
  <b>Wallpaper:</b> 
     Rayman Legends Game sms<br />
  <b>Categories: </b>
     <a href="/games-desktop-wallpapers.html" title="Games wallpapers"> Games</a>
  <br /><b>

我需要的是让文本代替“游戏”在页面刷新时它会像

<div class="sms-separator"></div>
 <div class="wallpaper-ads-right">
    <b>Wallpaper:</b> 
      Souya ssss<br />
    <b>Categories: </b>
      <a href="/soutss-tourguides" title="Tour"> Tourist</a><br /><b>

现在从上面的内容我想刮“游客”

问题是之前的 a href 和 title 标记具有动态内容,它们因页面而异,所以我怎样才能将它放在正则表达式中?

4

2 回答 2

0
<?php
while ($line = fgets(STDIN))
    if (preg_match('?<a href=".*" title=".*">(.*)</a>?', $line, $match))
        echo $match[1], "\n";
?>
于 2013-06-25T12:30:13.523 回答
0

描述

此表达式将捕获该部分的标题以及每个链接的 href 和标题。我将其保留为多行表达式以提高可读性。多行正则表达式确实需要x在模式选项中忽略空格

<b>[\w\s]+:\s*<\/b>.*?
<a\b(?=\s)
(?=(?:[^>=]|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*?\shref=('[^']*'|"[^"]*"|[^'"][^\s>]*))
(?=(?:[^>=]|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*?\stitle=('[^']*'|"[^"]*"|[^'"][^\s>]*))

在此处输入图像描述

展开

  • <b>[\w\s]+:\s*<\/b>.*?找到类别标题并捕获之前的文本:
  • <a\b(?=\s)匹配打开的锚标记
  • (?=(?:[^>=]|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*?\shref=('[^']*'|"[^"]*"|[^'"][^\s>]*))收集href值,注意这里的额外绒毛是为了防止奇怪的边缘情况,并允许属性在标签内以任意顺序出现
  • (?=(?:[^>=]|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*?\stitle=('[^']*'|"[^"]*"|[^'"][^\s>]*))收集标题值,与上面的 href 匹配相同的绒毛

PHP 代码示例:

输入文本

<div class="sms-separator"></div>
<div class="wallpaper-ads-right">
  <b>Wallpaper:</b> 
     Rayman Legends Game sms<br />
  <b>Categories: </b>
     <a href="/games-desktop-wallpapers.html" title="Games wallpapers"> Games</a>
  <br /><b>
<div class="sms-separator"></div>
 <div class="wallpaper-ads-right">
    <b>Wallpaper:</b> 
      Souya ssss<br />
    <b>Categories: </b>
      <a href="/soutss-tourguides" title="Tour"> Tourist</a><br /><b>

代码

<?php
$sourcestring="your source string";
preg_match_all('/<b>([\w\s]+):\s*<\/b>[\s\r\n]*?
<a\b(?=\s)
(?=(?:[^>=]|=\'[^\']*\'|="[^"]*"|=[^\'"][^\s>]*)*?\shref=(\'[^\']*\'|"[^"]*"|[^\'"][^\s>]*))
(?=(?:[^>=]|=\'[^\']*\'|="[^"]*"|=[^\'"][^\s>]*)*?\stitle=(\'[^\']*\'|"[^"]*"|[^\'"][^\s>]*))/imsx',$sourcestring,$matches);
echo "<pre>".print_r($matches,true);
?>

火柴

$matches Array:
(
    [0] => Array
        (
            [0] => <b>Categories: </b>
     <a
            [1] => <b>Categories: </b>
      <a
        )

    [1] => Array
        (
            [0] => Categories
            [1] => Categories
        )

    [2] => Array
        (
            [0] => "/games-desktop-wallpapers.html"
            [1] => "/soutss-tourguides"
        )

    [3] => Array
        (
            [0] => "Games wallpapers"
            [1] => "Tour"
        )

)
于 2013-06-25T16:02:51.247 回答