【问题标题】:Matching basic HTML using regex (or any other way)使用正则表达式(或任何其他方式)匹配基本 HTML
【发布时间】:2013-07-13 22:49:35
【问题描述】:

我有一些 HTML 如下:

    <b>This is a title: </b> 0091 + Two + 423 + Four + (Five, Six, Seven)
    <b>Some more text: </b> Abc + Hi + Random + Text + (Hello, 522, Four)
    ...
    <b>Hello world!: </b> Test + Foo + 1122 + (120, 122, Four)

现在,使用php,我想将其拆分并制作两个数组,如下所示:

数组 1 -(这将包含 &lt;b&gt; 标记中的所有内容)

    [0] -> <b>This is a title: </b>
    [1] -> <b>Some more text: </b>
    ...
    [n] -> <b>Hello world!: </b>

数组 2 -(这将包含所有 &lt;b&gt; 标签)

    [0] -> 0091 + Two + 423 + Four + (Five, Six, Seven)
    [1] -> Abc + Hi + Random + Text + (Hello, 522, Four)
    ...
    [n] -> Test + Foo + 1122 + (120, 122, Four)

我尝试使用正则表达式和preg_match_all,但我似乎无法弄清楚它们。任何帮助将不胜感激。

谢谢!

【问题讨论】:

  • 不要使用正则表达式解析 HTML。您无法使用正则表达式可靠地解析 HTML,并且您将面临悲伤和挫败感。一旦 HTML 与您的期望发生变化,您的代码就会被破坏。有关如何使用已经编写、测试和调试的 PHP 模块正确解析 HTML 的示例,请参阅 htmlparsing.com/php
  • 嗨,安迪!我已经在使用simple_html_dom 库(在您发布的链接中提到)。特别是我在处理这个字符串时遇到了困难,我决定走正则表达式路线。只针对这种情况。否则,我将使用 HTML 解析器库来处理其余部分。感谢您的输入:)

标签: php html regex preg-match preg-match-all


【解决方案1】:

你可以试试这个:

<pre>
<?php

$subject =<<<LOD
<b>This is a title: </b> 0091 + Two + 423 + Four + (Five, Six, Seven)
<b>Some more text: </b> Abc + Hi + Random + Text + (Hello, 522, Four)
<b>Hello world!: </b> Test + Foo + 1122 + (120, 122, Four)
LOD;

$pattern = '~(<b>.*?</b>)((?>[^<]+|<(?!b))*)~';
preg_match_all($pattern, $subject, $matches);

array_shift($matches);
array_walk_recursive($matches,function (&$val){ $val=trim($val); });
list($array1, $array2) = $matches;

print_r($array1);
print_r($array2);

【讨论】:

    【解决方案2】:
    <?php 
    $string = '    <b>This is a title: </b> 0091 + Two + 423 + Four + (Five, Six, Seven)
        <b>Some more text: </b> Abc + Hi + Random + Text + (Hello, 522, Four)
        ...
        <b>Hello world!: </b> Test + Foo + 1122 + (120, 122, Four)';
    preg_match_all("#(<b>[^<]+<\/b>)([^<]+)#", $string, $matches);
    print_r($matches);
    ?> 
    

    输出:

    Array
    (
        [0] => Array
            (
                [0] => <b>This is a title: </b> 0091 + Two + 423 + Four + (Five, Six, Seven)
    
                [1] => <b>Some more text: </b> Abc + Hi + Random + Text + (Hello, 522, Four)
        ...
    
                [2] => <b>Hello world!: </b> Test + Foo + 1122 + (120, 122, Four)
            )
    
        [1] => Array
            (
                [0] => <b>This is a title: </b>
                [1] => <b>Some more text: </b>
                [2] => <b>Hello world!: </b>
            )
    
        [2] => Array
            (
                [0] =>  0091 + Two + 423 + Four + (Five, Six, Seven)
    
                [1] =>  Abc + Hi + Random + Text + (Hello, 522, Four)
        ...
    
                [2] =>  Test + Foo + 1122 + (120, 122, Four)
            )
    
    )
    

    【讨论】:

    • Akram,这很完美!非常感谢。 :) 有什么好的建议可以让我了解更多关于正则表达式的信息吗?
    • 自己动手试试吧,正则表达式很好学……搜索谷歌
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多