我想在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评论之间的文字? 提前致谢
答案 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-->)
警告:只要你的评论键(例如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);