使用DOM在HTML中查找一行/一行文本

时间:2012-05-07 15:32:02

标签: php domdocument

我有一些纯文本/ HTML内容,如下所示:

Title: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Snippet: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Category: Lorem ipsum dolor sit amet, consectetur adipiscing elit.

我想只匹配“ Snippet:”及其后面的文字所在的行,但仅限于该行,没有其他内容,并且还会进行搜索案例 - 不敏感。我尝试使用正则表达式,但最终我想尝试使用DOMDocument,我该怎么做?

2 个答案:

答案 0 :(得分:2)

如果涉及DOM,请参阅我在评论中链接的副本。

否则你可能只是寻找一个正则表达式:

$line = preg_match('~(^Snippet:.*$)~m', $text, $matches) ? $matches[1] : NULL;

Demo和正则表达式解释:

~  -- delimiter
 (  -- start match group 1
  ^  -- start of line
    Snippet:  -- exactly this text
    .*  -- match all but newline
  $  -- end of line
 )  -- end match group 1
~  -- delimiter
m  -- multiline modifier (^ matches begin of line, $ end of line)

答案 1 :(得分:1)

我不知道有关您问题的一些细节,所以我的回答可能不合适。您可以根据需要解析的内容大小来决定这不是一个选项。另外,从问题不清楚html内容到底在哪里,这就是为什么我写这个不使用DOM解析的解决方案。

可能的解决方案可能是获取要在数组中解析的行。之后,您可以过滤数组,从结果中删除与您的规则不匹配的行。

样本将是:

//this is the content
$text = 'Title: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Snippet: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Category: Lorem ipsum dolor sit amet, consectetur adipiscing elit.';

//get the lines from your input as an array.. you could acheive this in a different way if, for example, you are reading from a file
$lines = explode(PHP_EOL, $text);

// apply a cusom function to filter the lines (remove the ones that don't match your rule)
$results = array_filter($lines, 'test_content');

//show the results
echo '<pre>';
print_r($results);
echo '</pre>';

//custom function here:
function test_content($line)
{
    //case insensitive search, notice stripos; 
    // type strict comparison to be sure that it doesn't fail when the element is found right at the start
    if (false !== stripos($line, 'Snippet'))
    {
        return true;
    }
    return false;//these lines will be removed 
}

这段代码只返回$ results数组中的一个元素,第二行

你可以在这里看到它:http://codepad.org/220BLjEk