4

我从使用WYSIWYG编辑器创建的地方获取文本,因此它充满了 html 标记。( b, p,strong等)

我需要做的是,在剥离标记之前,确保每一行/段落都以句号结尾。如果有句号,则不要执行任何操作,但如果 </p> 之前的字符不是句号,则添加一个。

我试过了:

$str = ereg_replace("[A-Za-z0-9]&lt;/p>", ".&lt;/p>", $str );

但这也去掉了句子中的最后一个字母(我理解应该这样)。就这样the end&lt;/p>变成了the en.&lt;/p>。有什么好方法可以做我想要实现的目标吗?

4

2 回答 2

4

这似乎可行,使用 2 个正则表达式反向引用 $1 和 $2。

第一个在括号中定义$1的正则表达式表示:不是句点,不是空格 [SP, Tab, ...] 后跟任意数量的空格或没有空格。简而言之,整个正则表达式声明:“<”之前的最后一个SOLID - VISIBLE字符不是句点“.”。

$2是一个 HTML 标签,例如 b, p, li, strong, h1,...

无点测试:

$str = "<p>This is a good text, but it's
very tedious  </p>";
preg_replace("/([^\.\s])[\s]*<\/([[:alnum:]]+)>/", "$1.</$2>", $str);
echo $str;

Gives:这是一篇很好的文章,但很乏味。

用点测试:

$str = "<p>This is a good text, but it's
very tedious.   </p>";
preg_replace("/([^\.\s])[\s]*<\/([[:alnum:]]+)>/", "$1.</$2>", $str);
echo $str;

Gives:这是一篇很好的文章,但很乏味。

简化的正则表达式:

$str = preg_replace("/([a-z0-9])<\/p>/i", "$1.</p>", $str);

为任何以数字或 ASCII 字母结尾且没有句号的段落添加句号。HTML 标记,例如 P 或 p,在这里不区分大小写。

于 2013-10-16T20:09:15.430 回答
0

使用否定的lookbehind有效:

$str = preg_replace("/(?<!\.)&lt;\/p>/", "$1.&lt;\/p>", $str);
于 2013-10-16T20:14:44.710 回答