如何在打印(xpath)之前检查文本是不是包含特定字符?

Posted

技术标签:

【中文标题】如何在打印(xpath)之前检查文本是不是包含特定字符?【英文标题】:How to check if text contains specific characters before printing (xpath)?如何在打印(xpath)之前检查文本是否包含特定字符? 【发布时间】:2021-06-21 15:18:05 【问题描述】:

所以现在我有这段代码,效果很好:

这需要 xpath 中的任何内容并打印。

<?php
$parent_title = get_the_title( $post->post_parent );
$html_string = file_get_contents('http://www.weburladresshere.com');
$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTML($html_string);
libxml_clear_errors();
$xpath = new DOMXpath($dom);
$values = array();
$row = $xpath->query('myquery');
foreach($row as $value) 
   print($value->nodeValue);


?>

我需要在代码中插入两件事(如果可能的话):

    要检查内容是否超过 x 个字符,则不要打印。 要检查内容中是否包含http,则不要打印。

如果以上两个都是否定的 - 把它打印出来。

如果其中一个是肯定的 - 跳过,然后检查同一页面上的第二个查询:

$row = $xpath->query('secondquery');

如果这也包含上述之一,则检查第三个查询(来自同一页面),依此类推。 直到匹配为止。

任何帮助将不胜感激。

【问题讨论】:

对于上述 #1 - 内容为完整 HTML 内容或 print($value-&gt;nodeValue); 内容大小? 这是个好问题。我认为任何一个都可以,只要它更容易实现并且能够显示所需的结果。 虽然他们会有两个完全不同的答案。您为整个 HTML 中找到的所有字符设置的阈值将与单行的阈值大不相同。这就是我在那里问的原因 在一行中。所以我猜是 print($value->nodeValue);内容大小。 【参考方案1】:

根据我对问题的理解,您希望有一种方法可以继续在 DOMDocument 上运行查询并评估以下条件。

    如果nodeValue 的字符串长度低于阈值 如果nodeValue的字符串不包含“http”

逻辑条件:

如果以上两个都为真,则回显到屏幕 如果其中一个为假,则运行下一个子查询

以下是使用 500 个字符作为长度的代码。我的示例有 3 个条目,其字符数如下:294、98 和 1305。

<?php
/**
 * @param $xpath
 * @param $xPathQueries
 * @param int $iteration
 */
function doXpathQuery($xpath, $xPathQueries, $iteration = 0)

    // Validate there's no more subquery to go through
    if (!isset($xPathQueries[$iteration])) 
        return;
    

    $runNextIteration = false;
    // Run the XPATH subquery
    $rows = $xpath->query($xPathQueries[$iteration]);
    foreach ($rows as $row) 
        $value = trim($row->nodeValue);
        $smallerThanLength = (strlen($value) < 500);
        
        // Case insensitive search, might use "http://" for less false positives
        $noHttpFound = (stristr($value, 'http') === FALSE);

        // Is it smaller than length, and no http found?
        if($smallerThanLength && $noHttpFound) 
            echo $value;
         else 
            // One of them isn't true so run the next query
            $runNextIteration = true;
        
    

    // Should we do the next query?
    if ($runNextIteration) 
        $iteration++;
        doXpathQuery($xpath, $xPathQueries, $iteration);
    


// Commented out this next line because I'm not sure what it does in this context
// $parent_title = get_the_title( $post->post_parent );

// Get all the contents for the URL
$html_string = file_get_contents('https://theeasyapi.com');
$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTML($html_string);
libxml_clear_errors();
$xpath = new DOMXpath($dom);

// Container that will hold all the rows that match the criteria
$values = [];

// An array containing all of the XPATH queries you want to run
$xPathQueries = ['/html/body/div/section', '/html/body/div'];
doXpathQuery($xpath, $xPathQueries);

这将运行放在$xPathQueries 中的所有查询,只要查询产生字符串长度大于 500 或找到“http”的值。

【讨论】:

完美。完全按照我的意愿工作。感谢您花时间编写代码。欣赏它。 很高兴听到这个消息!祝你的项目好运

以上是关于如何在打印(xpath)之前检查文本是不是包含特定字符?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查一个文件的值是不是包含在另一个文本文件中? (perl 脚本)

如何在 PHP 中使用 XPath 设置 (not(contains))

使用 XPATH 搜索包含的文本

如何检查类名中是不是存在单词?

如何检查 int var 是不是包含特定数字

检查逗号分隔列表是不是包含特定数字[重复]