我正在尝试在PHP CMS中提取TinyMCE中的预告文本。我的设计中未使用<hr />
标记,因此我希望在以下方案中提取文本,前提是内容管理员仅使用它们来定义Teaser文本:
在<hr />
代码之前提取内容(在内容管理员在RTE开头输入预告文本然后使用<hr />
作为cuttof点的情况下)
在2个<hr />
代码之间提取内容(在内容管理员在内容中的任何位置输入预告文字的情况下,并在两侧标有<hr />
个标记。
我应该用什么正则表达式来涵盖上述内容?
答案 0 :(得分:0)
我不确定我是否正确地提出了您的问题,但这是一次尝试:
if (preg_match('~^(.*?)<hr />((.+?)<hr />)?~is', $test, $matches)) {
// at least one <hr /> present
if (empty($matches[2])) {
// no second <hr />
$teaser = $matches[1];
} else {
// there is a second <hr />
$teaser = $matches[3];
}
} else {
// no teaser
$teaser = "";
}
答案 1 :(得分:0)
<?php
$strs = array(
'GET ME A <hr /> bla',
'Bla bla<hr /> GET ME B <hr />'
);
foreach($strs as $str) {
$a = preg_match_all('/(<hr \/>)?(?P<teaser>.*?)<hr \/>/', $str, $matches);
var_dump($a, $matches);
}
int(1)
array(4) {
[0]=>
array(1) {
[0]=>
string(15) "GET ME A <hr />"
}
[1]=>
array(1) {
[0]=>
string(0) ""
}
["teaser"]=>
array(1) {
[0]=>
string(9) "GET ME A "
}
[2]=>
array(1) {
[0]=>
string(9) "GET ME A "
}
}
int(2)
array(4) {
[0]=>
array(2) {
[0]=>
string(13) "Bla bla<hr />"
[1]=>
string(16) " GET ME B <hr />"
}
[1]=>
array(2) {
[0]=>
string(0) ""
[1]=>
string(0) ""
}
["teaser"]=>
array(2) {
[0]=>
string(7) "Bla bla"
[1]=>
string(10) " GET ME B "
}
[2]=>
array(2) {
[0]=>
string(7) "Bla bla"
[1]=>
string(10) " GET ME B "
}
}
答案 2 :(得分:0)
这个经过测试的功能可以解决这个问题:
function get_teaser($text) {
// First count how many <hr/> tags there are.
$count = preg_match_all('%<hr\s*/?>%i', $text, $matches);
if (!$count) return ''; // None? return empty string.
switch($count) {
case (1): // Case I: From start up to only HR tag.
preg_match('%^(.*?)<hr\s*/?>%si', $text, $matches);
return $matches[1];
break;
case (2): // Case II: Stuff between two HR tags.
preg_match('%<hr\s*/?>(.*?)<hr\s*/?>%si', $text, $matches);
return $matches[1];
break;
default: // Case III: Three or more HR tags is an error.
return 'Error! Too many <hr /> tags.';
}
}
这也允许各种HR标签形式:例如<hr>
,<hr/>
,<hr />
。