有没有一种方法可以只从url中删除换行符,同时保留其他换行符



我试图只从文本正文中的url中剥离换行符,同时保留所有其他换行符。其他换行符稍后将被转换为<p>标记,因此保持原样很重要

给定这个带有多个带有url的标签的文本示例(这应该都在一行上,换行符仅用于可读性(:

"Lorem ipsum dolor <a href="http://www.example.org/page?nid=161&_te=mj">sit</a> amet,
consectetur adipiscing elit. nDuis facilisis eros at sem faucibus finibus. Integer tempus
lectus sed gravida efficitur. Proin dignissim pretium arcu, accumsan gravida ex tincidunt
eget. Maecenas ac finibus elit. Maecenas aliquam fermentum nisl quis egestas. 
<a href="http://www.example.org/page?id=341n&_te=mp">Nulla placerat est vitae convallis</a> 
euismod. Praesent id elit a ligula hendrerit lacinia."

我找到了一种方法,通过使用这种模式来隔离文本中的一个链接

bhttps?://[^<>]+(?:([wd]+)|[^,[:punct:]s]|/)

然而,我完全不知道如何从子字符串中去掉换行符,或者只在url模式中匹配换行符。最终,这将进入一些php代码,并且需要替换字符串中的所有情况,所以如果有更好的php实用程序方法可以做到这一点,我会洗耳恭听的!

我要做的是(只有在url中被删除,所有其他都被保留(:

"Lorem ipsum dolor <a href="http://www.example.org/page?id=161&_te=mj">sit</a> amet,
consectetur adipiscing elit. nDuis facilisis eros at sem faucibus finibus. Integer tempus
lectus sed gravida efficitur. Proin dignissim pretium arcu, accumsan gravida ex tincidunt
eget. Maecenas ac finibus elit. Maecenas aliquam fermentum nisl quis egestas. 
<a href="http://www.example.org/page?id=341&_te=mp">Nulla placerat est vitae convallis</a> 
euismod. Praesent id elit a ligula hendrerit lacinia."

这是一个非常具体的问题,与相关联的任何重复项都不匹配。我正在处理一个遗留系统,无法使用DOM解析来解决这个问题。请使用正则表达式回答此问题。

不要试图用regex解析html,充其量你会得到一些有效的东西,直到它不再有效!HTML是一种过于复杂、充满陷阱的语言,即使乍一看很简单。

当您想要编辑任何语言的编程代码时,第一个条件是为这种语言寻找解析器。有了PHP,就有了用于XML和HTML的DOM解析器。

有了它,你可以遵循以下简单步骤:

  • 提取href属性
  • 替换其中的换行符
  • 使用结果设置href属性

由于您处理的是部分html文档(*(,因此必须将其包装在完整的html文档结构中,以避免解析器自动更正(包括添加根元素(。显然,最后您需要删除这个从主体中提取子节点的包装器。

$str = "Lorem ipsum dolor <a href="http://www.example.org/page?nid=161&_te=mj">sit</a> amet,
consectetur adipiscing elit. nDuis facilisis eros at sem faucibus finibus. Integer tempus
lectus sed gravida efficitur. Proin dignissim pretium arcu, accumsan gravida ex tincidunt
eget. Maecenas ac finibus elit. Maecenas aliquam fermentum nisl quis egestas. 
<a href="http://www.example.org/page?nid=341&_te=mp">Nulla placerat est vitae convallis</a> 
euismod. Praesent id elit a ligula hendrerit lacinia.";
libxml_use_internal_errors(true);
$wrapper = '<html><head><meta charset="utf-8"/></head><body>%s</body></html>';
$html = sprintf($wrapper, $str);
$dom = new DOMDocument;
$dom->loadHTML($html);
foreach ($dom->getElementsByTagName('a') as $aElt) {
$href = $aElt->getAttribute('href');
$href = str_replace("n", '', $href);
$aElt->setAttribute('href', $href);
}
$result = '';
$bodyElt = $dom->getElementsByTagName('body')->item(0);
foreach ($bodyElt->childNodes as $node) {
$result .= $dom->saveHTML($node);
}
echo $result;

(*(如果使用完整的HTML文档,则不需要包装器,并且可以直接使用不带参数的DOMDocument::saveHTML()方法获得结果

最新更新