【问题标题】:How to filter simplexml_load_file foreach loop?如何过滤 simplexml_load_file foreach 循环?
【发布时间】:2023-03-06 02:35:01
【问题描述】:

我有以下 php 代码:

<?php
$website_url = 'domain.com/sitemap.xml';
$xml=simplexml_load_file(''. $website_url.'') or die("Error: Cannot create object");
foreach($xml->url as $val)
 {
   echo $val->loc.  '<br>';
 }

它工作正常,我从 xml 站点地图文件中获取 url,但我想过滤正匹配(以及负匹配之后),例如只包含“apple”和“juice”的行(以及否定,仅包含不包含 "rss" 或 "sitemap") 的行。我尝试了几种使用 preg_match 的方法,但没有成功,我得到空白页结果或 500 错误。 我提取并想要过滤的 xml 文件(一个简单的 sitemap.xml 文件)有大约 20000 行/url

【问题讨论】:

  • 向我们展示您的尝试,我们可以尝试找出您出错的地方。
  • 字符串是否需要包含 both 关键字,还是您的意思是 any 关键字? (是and 还是or?)

标签: php xml foreach preg-match


【解决方案1】:

尝试使用http://php.net/strpos 进行匹配。您还可以检查 rss 和站点地图:

foreach($xml->url as $val)
 {
   $url = $val->loc;
    if(strpos($url, 'apple') !== FALSE && strpos($url, 'juice') !== FALSE) {
        echo "keyword found in URL\n";
        break;
    }
    else {
        echo "keyword not found\n";
    }
 }

【讨论】:

  • 有什么方法可以从 strops 中的 $variable 获取 AND (&&) 或 OR (||) 吗?
【解决方案2】:

可以为此使用xpath()

特别是contains():

foreach($urlset->xpath('url[contains(., "foo")]') as $url) {

要否定,请将表达式包装在not()

foreach($urlset->xpath('url[not(contains(., "foo"))]') as $url) {

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-13
    • 1970-01-01
    • 1970-01-01
    • 2016-10-16
    • 2021-07-15
    • 2017-01-27
    • 1970-01-01
    相关资源
    最近更新 更多