我怎样才能获得html commetns start end与正则表达式之间的字符串?

时间:2018-05-30 02:45:48

标签: php html regex

我想在HTML评论的开始和结束之间发短信喜欢

<!--Q1-->
\nフレンチブルドックと遊んでるとき\n
<!--Q1END-->\n
<!--Q2-->
\n表参道、新宿、銀座\n
<!--Q2END-->\n
<!--Q3-->
\nヒューマンドラマ全般が好きです。<BR>\n<BR>\n好きなアーティスト サザンオールスターズ\n
<!--Q3END-->

我想把它像这样的数组

$data = [
 1 => 'フレンチブルドックと遊んでるとき',
 2 => '表参道、新宿、銀座',
 3 = 'ヒューマンドラマ全般が好きです。<BR>\n<BR>\n好きなアーティスト サザンオールスター  ズ'
]

那我怎样才能找到html评论之间的文字? 提前致谢

2 个答案:

答案 0 :(得分:1)

这是一个正则表达式,可以为您提供上述字符串所需的内容:

/<!--Q(\d)-->\n\\n(.*)\\n\n<!--Q\1END-->/gs

(注意:这会删除你想要的每个字符串之前和之后的文字'\n',因为这就是你上面的内容,但是如果字符串没有这个,那就赢了匹配。)

要把它放到PHP中,记住你必须双重转义文字反斜杠。不幸的是,跟踪所有换行符和文字'\n'字符串(至少对我而言)是非常难看的。

preg_match_all('/<!--Q(\d)-->\n\\\\n(.*)\\\\n\n<!--Q\1END-->/s', $text, $matches);
print_r($matches[2]);

或者,如果您想要更具可读性的内容,可以从输入文本中删除文字'\n'字符串,匹配HTML引号之间的所有内容,然后修剪它:

// Remove all literal '\n' strings from the text
$text = preg_replace('#\\\\n#', '', $text);

// Match desired strings
preg_match_all('/<!--Q(\d)-->(.*)<!--Q\1END-->/s', $text, $matches);

// Trim all desired strings
$output = array_map('trim', $matches[2]);

答案 1 :(得分:1)

为了得到你想要的东西,看起来很好的选择:

(?<=<!--([A-Z]\d)-->)[\s\S]*?(?=<!--\1END-->)

Demo

警告:只要你的评论键(例如Q1)不超过A0-Z9就可以使用。您不能简单地使用[A-Z]\d+,因为PHP的/ PCRE正则表达式引擎不喜欢外观中的量词/可变长度模式。

否则,我建议使用这样的捕获组:

<!--([A-Z]\d+)-->([\s\S]*?)<!--\1END-->

在你的代码中使用它:

$re = '/<!--([A-Z]\d+)-->([\s\S]*?)<!--\1END-->/s';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);

要删除换行符,只需使用trim(),有几种方法可以应用它,例如: foreach,map等等。

foreach ($matches as $match){
  $result[] = trim($match[2]);
}
var_dump($result);