1

我正在尝试编写一个正则表达式来替换文本文件某些区域之间的换行符,但仅限于纯文本内容(即排除 HTML 属性内容中的文本,如 href),但在第一部分之后运气不佳。

示例输入:

AUTHOR: Me
DATE: Now
CONTENT:
This is an example. This is another example. <a href="http://www.stackoverflow/example-
link-that-breaks">This is an example.</a> This is an example. This is yet another
example.
END CONTENT
COMMENTS: 0

示例输出:

AUTHOR: Me
DATE: Now
CONTENT:
This is an example. This is another example. <a href="http://www.stackoverflow/example-link-that-breaks">This is an example.</a> This is an example. This is yet another example.
END CONTENT
COMMENTS: 0

因此,理想情况下,如果换行符出现在纯文本中,则空格会替换换行符,但如果它们在 HTML 参数内(主要是 href,如果我必须限制它,我很好)。

4

2 回答 2

1

这将删除属性值中的换行符,假设值用双引号括起来:

$s = preg_replace(
       '/[\r\n]+(?=[^<>"]*+"(?:[^<>"]*+"[^"<>]*+")*+[^<>"]*+>)/',
       '', $s);

前瞻断言,在当前位置(找到换行符的位置)和下一个>之间,有奇数个双引号。这不允许使用单引号值或值内的尖括号;如果需要,两者都可以容纳,但这已经够难看的了。;)

之后,您可以用空格替换任何剩余的换行符:

$s = preg_replace('/[\r\n]+/', ' ', $s);

在 ideone.com 上查看它的实际应用。

于 2010-10-22T01:27:43.460 回答
1

理想情况下,您将使用真正的 HTML 解析器(或 XML,它是 XHTML)并用它替换属性内容。

但是,如果引擎支持任意长度的正向lookbehind,则以下方法可能会起作用:

(?<=\<[^<>]+=\s*("[^"]*|'[^']*))[\r\n]+

用法:用空字符串替换此正则表达式的所有出现。

于 2010-10-21T23:33:28.767 回答