【问题标题】:Capturing text within HTML tag using PHP and preg_match [duplicate]使用 PHP 和 preg_match 在 HTML 标记中捕获文本 [重复]
【发布时间】:2017-06-02 20:41:25
【问题描述】:

我的脚本遇到了障碍,我必须检查某个网站上的可用性。我需要 html 标记中的文本,但我不确定如何处理它。

我测试过的代码是这样结束的:

<?php
ini_set("allow_url_fopen", 1);
$homepage2 = file_get_contents('https://www.someurlwithavailability.com');
//URL has the following HTML tag: <div id="Availability">
                            Availability: Special Offer, ships within 10 - 15 business days                         </div>"
preg_match("/<div id="Availability">(.*?)</div>/si", $homepage2, $avail);
print_r($avail);
echo '<br>', '~Availability is~', '<br>', $avail, '<br>';
$stringavail=implode(" ",$avail);
echo $stringavail;
?>

根据我在 preg_match(***,$homepage2, $avail); 之后放置的内容,我会收到各种错误。而且我不确定我需要输入什么语法来检索文本。

我上面的代码给了我这个:

解析错误:语法错误,第 6 行 /u/o/placeiamrunningthecodefrom.php 中的意外“可用性”(T_STRING)

请求的 URL 带有一个非常大的完整 HTML 页面。这个 HTML 标签是唯一的,不会重复。

谁能帮帮我?

【问题讨论】:

  • 有没有使用 php dom 的选项?如果元素 id/类不是动态的,我更喜欢使用 php dom 来解析 html 字符串
  • 我读过 DOM,但我对它如何修改我必须使用的 html 感到困惑。所以我试图远离它。
  • 通过这些答案的组合,我现在有了一个解决方案。谢谢!

标签: php html preg-match file-get-contents


【解决方案1】:

虽然这可以与正则表达式一起工作。不推荐,也不方便。

我建议试试DOMDocument::getElementById。它甚至在页面上有一个示例:

$doc = new DomDocument;

// We need to validate our document before refering to the id
$doc->validateOnParse = true;
$doc->Load('book.xml');

echo "The element whose id is 'php-basics' is: " . $doc->getElementById('php-basics')->tagName . "\n";

现在要获取内容而不是 tagName,我们可以使用继承自 domnode-&gt;textContent

【讨论】:

    【解决方案2】:

    尝试在该模式周围使用单引号。 并且,请确保您正在转义特殊的正则表达式字符。 而且,您实际上是在要求最后&lt;/div&gt; 的所有内容。所以,你需要更具体。

    '/&lt;div id="Availability"&gt;([^&lt;]*)&lt;\/div&gt;/si'

    而不是

    "/&lt;div id="Availability"&gt;(.*?)&lt;/div&gt;/si"

    当然,如果&lt;div&gt;里面有html的话,这还是不可靠的

    但是,这应该让你更接近。

    另外,试试在线正则表达式工具。我喜欢这一个。 https://regex101.com/

    【讨论】:

    • 我认为我要查找的文本之间的空格也可能有问题。我会试试这个,看看会发生什么。
    • 在代码中更改为 ([^
    【解决方案3】:

    问题是你的双引号字符串中有双引号,并且没有转义它们:

    preg_match("/<div id="Availability">(.*?)</div>/si", $homepage2, $avail);
                         ^            ^
    

    如果您使用了不错的 IDE,它会在您输入时提醒您这一点。

    只需将分隔引号更改为单引号。

    此外,由于您的正则表达式分隔符 / 出现在正则表达式中,您要么需要转义它出现在正则表达式中的字符,要么使用表达式中没有的分隔符。

    preg_match('#<div id="Availability">(.*?)</div>#si', $homepage2, $avail);
    

    但是,使用正则表达式解析 HTML 通常是个坏主意。您应该使用像 DOMDocument 类这样的 DOM 解析器库。

    【讨论】:

    • 这不是唯一的问题。 / 用作分隔符,但也在结束 div 标记中。
    • 很好,我已经更新了解决这个问题的答案。
    • 我尝试了几种分隔符组合,但一直遇到同样的语法问题。我会用井号试试你的建议
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    • 2011-08-07
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多