我有一些纯文本/ 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,我该怎么做?
答案 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