0

我是 Regualr Expressions 的新手,但我还没有掌握它的窍门。

我已经使用 CURL 和 PHP 从给定网页中抓取了 html 内容。这个网页永远不会改变它的结构。页面上的结果取决于搜索功能,但 html 标签始终相同。我需要根据输入的搜索词从页面中获取结果数据。

我需要的数据是:

<h1 class="location_only">(555) 555-5555 is a Landline</h1>

所以我需要抓住两者之间的任何东西

<h1 class="location_only"></h1>

如果我有$data,这是生成的 HTML,我如何将它放入正则表达式并将我找到的数据回显为$result

4

5 回答 5

2

请不要使用正则表达式来解析 HTML。

请使用 HTML 解析器,例如Simple HTML DOM Parser。您的问题可能看起来是本地化的,但事实并非如此。即使是这样,这种类型的问题也很容易在以后扩大范围,即使你可以让它与正则表达式一起工作,这也会让你非常头疼。

于 2012-04-23T16:16:22.570 回答
1

您可以使用此搜索模式在标签之间选择文本:

<span id="result1">(.*?)</span>

如果您的代码是:<span id="result1">(555) 555-5555 is a Landline</span>.

有关如何回显结果的更多信息,请参见preg_match() 。

还可以像其他人建议的那样查看 HTML DOM Parser。也许我根本不应该回答...

于 2012-04-23T16:20:32.467 回答
0

您已经被警告过不要使用正则表达式来解析 HTML。所以这是一个基于 DOM 解析器的代码来提取你的值:

$html = <<< EOF
<html>
<head>
<title>Some Title</title>
</head>
<body>
<H1 class="location_only">(555) 555-5555 is a Landline</H1>
</body>
</html>
EOF;
$doc = new DOMDocument();
libxml_use_internal_errors(true);
$doc->loadHTML($html); // loads your html
$xpath = new DOMXPath($doc);
$value = $xpath->evaluate("string(//h1[@class='location_only']/text())"); 
echo "Your H1 Value=[$value]\n"; // prints text between <h1> and </h1>

输出:

Your H1 Value=[(555) 555-5555 is a Landline]
于 2012-04-23T17:08:01.413 回答
0

告诉您不要使用正则表达式而是使用 DOM 解析器的两个答案都是正确的,但是,如果页面的结构没有改变,那么一个快速而肮脏的正则表达式就可以很好地解决问题,因为您有绝对好的开始和参考的终点。

于 2012-04-23T16:17:52.793 回答
0

您无法使用正则表达式从 HTML 中可靠地提取信息。但是,您可以使用 HTML 解析器,例如DOMDocument::LoadHTML。这将从字符串中获取您的 HTML,然后您可以使用getElementByIdgetElementByTagName等函数来查找您的值。还有其他的 HTML 解析器。

于 2012-04-23T16:15:21.123 回答