如何在打印(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->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 脚本)