如何使用 preg_match 或其他方法将数据从 html 提取到 PHP 数组

How to Extract data from html to PHP Array using preg_match or other method

提问人:Yogesh Saroya 提问时间:5/3/2023 更新时间:5/3/2023 访问量:37

问:

我有来自旧网站的 html 页面,其中包含使用以下格式的一些地方的列表。

<p><b>Ado’s Kitchen &amp; Bar&nbsp; </b>1143 13th St., 720-465-9063; <a href="http://www.span-ishatthehill.com">span-ishatthehill.com.</a> Laid back restaurant with global menu. Open for breakfast and lunch daily and dinner Mon.-Sat.</p>
    

<p><strong>Blackbelly Market</strong> 1606 Conestoga St. #3, 303-247-1000; <a href="http://www.blackbelly.com">blackbelly.com</a>. Locavore dining, butchery and bar. Open daily for happy hour and dinner; see website for market hours.</p>

我将使用此数据来列出页面。所以我需要以正确的格式获取这些数据,例如

$arr = [
'name'=>'', //in <b> tag
'address'=>'', //after <b> tag
'phone'=>'', //after address. address is end with comma 
'website'=>'', //after number number, number is ended with semicolon and in a tag
'description'=>'', //after <a> tag
]

我尝试使用preg_match但无法提取标签中没有的内容,例如地址或电话号码等。

$htmlContent = 'content here';
preg_match('/<b>(.*?)<\/b>/s', $htmlContent, $match); /*for address */
    preg_match('/< strong >(.*?)<\/strong >/s', $htmlContent, $match); /*for address */

preg_match('/<a href="(.*?)">(.*?)<\/a>/s', $htmlContent, $match); /*for website */

使用此代码,我可以获取网站地址或地址(来自标签),但如何获取电话、地址和其他详细信息?

谢谢

PHP 网页抓取 preg-match

评论


答:

1赞 martin 5/3/2023 #1

您可以使用单个正则表达式来捕获数据。喜欢这个:

preg_match('#<p><b>(?<name>.*)</b>(?<address>.*),(?<phone>.*);.*<a.*href="(?<website>.*)".*>.*</a>(?<description>.*)</p>#', $htmlContent, $match);

然后,您可以像这样检索匹配项:

$name = $match['name'];
$address = $match['address'];
$phone = $match['phone'];
...

如果您想更详细地了解此正则表达式的工作原理,这里是链接: [1]:https://regex101.com/r/EYpXwi/1

评论

2赞 idchi 5/3/2023
如果您还想同时捕获 and 标签,那应该是<b>(?<name>.*)</b>(<strong>|<b>)(?<name>.*)(</strong>|</b>)<b><strong>