php - 如何使用从这个字符串中提取数据

标签 php regex

我不擅长写模式来提取数据。 我有很长的文档,下面是我需要提取的具体字符串。

<p><span id="minPrice">XXXX<a href="YYYYY" target="_blank"><span>&yen;ZZZZZ</span></a></span>

我想提取XXXX, YYYY,ZZZZ值(value)。

我的第一步是获取 XXXX<a href="YYYYY" target="_blank"><span>&yen;ZZZZZ

$pattern = '/<p><span id="minPrice">^</span></a></span>/';
preg_match($pattern, $data, $matches);
echo ($matches[1]);

但它不起作用。 那么如何提取XXXX, YYYY, and ZZZZ :(

我的文档充满了错误编码字符,因此我无法使用 loadHTML。它只是返回错误。

更新 1:所以我能够做到

        var_dump(libxml_use_internal_errors(true));
        $DOM = new DOMDocument;
        $DOM->loadHTML($data);
        $items = $DOM->getElementById('minPrice');

$items 是

 DOMElement Object
(
    [tagName] => span
    [schemaTypeInfo] => 
    [nodeName] => span
    [nodeValue] => 最安価格(税込):¥131,649
    [nodeType] => 1
    [parentNode] => (object value omitted)
    [childNodes] => (object value omitted)
    [firstChild] => (object value omitted)
    [lastChild] => (object value omitted)
    [previousSibling] => 
    [nextSibling] => (object value omitted)
    [attributes] => (object value omitted)
    [ownerDocument] => (object value omitted)
    [namespaceURI] => 
    [prefix] => 
    [localName] => span
    [baseURI] => 
    [textContent] => 最安価格(税込):¥131,649
)

html是

<span id="minPrice">
    �ň����i(�ō�)�F
    <a href="http://kakaku.com/shop/1115/?pdid=K0000693648&lid=shop_itemview_saiyasukakaku" target="_blank">
        <span>&yen;131,649</span>
    </a>
</span>

如何提取 http://kakaku.com/shop/1115/?pdid=K0000693648&lid=shop_itemview_saiyasukakaku131,649

最佳答案

您可以使用以下代码行为 DOM 解析器启用内部错误处理:

libxml_use_internal_errors(true);

然后,您可以使用此示例代码访问所需的数据:

$html = <<<DATA
<p><span id="minPrice">最安価格(税込):<a href="http://kakaku.com/shop/1115/?pdid=K0000693648&lid=shop_itemview_saiyasukakaku" target="_blank"><span>&yen;131,649</span></a></span>
DATA;

$dom = new DOMDocument('1.0', 'UTF-8');
$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);

$xpath = new DOMXPath($dom);
$spans = $xpath->query('//span[@id="minPrice"]');   // Get all spans with ID=minPrice
$a = array();
foreach($spans as $span) { 
    foreach($span->childNodes as $child) {          // Check the child nodes
        if ($child->nodeName == "a") {
            array_push($a, $child->getAttribute("href"));
        }
    }
    array_push($a, preg_replace('~^.*?(\d+(?:,\d+)*)$~u', '$1', $child->nodeValue));
}

print_r($a);

结果:

Array
(
    [0] => http://kakaku.com/shop/1115/?pdid=K0000693648&lid=shop_itemview_saiyasukakaku
    [1] => 131,649
)

我使用正则表达式提取字符串末尾的数字,但您也可以使用带有日元符号的 explode

$num = explode(html_entity_decode("&yen;"), $child->nodeValue)[1];
array_push($a, $num);

参见 another demo

关于php - 如何使用从这个字符串中提取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36079886/

相关文章:

php - 从更新的命令行输出中获取百分比 - Regex 和 PHP

php - Cakephp - 相关表

php - 普通ajax和长轮询的区别

regex - 正则表达式在imap响应中获取文件的base64字符串

c# - 使用 C# 和正则表达式解析日志文件

javascript - 正则表达式选择双引号之间的特定字符

php - 长轮询服务器

php - 如何自动提交数据 html 表单?

php - 复杂的 MySQL 查询,多表 - 如何编写这个关系查询?

regex - 如何在scala中截断一个单词后的字符串