如何在HTML标签内替换空格,同时将标签保留在PHP中(preg_replace)?

问题描述 投票:2回答:2

假设我有这个字符串:

$string = '<p > ¡Esto es una prueba! < /p > <p> <strong > Prueba 123 </strong> </p> <p> <strong> < a href="https://matricom.net"> MATRICOM < / a> </ strong> </p> <p> <strong > Todas las pruebas aquí ... </strong > < /p>'

我想做的是使用PHP修复HTML标记(由于空格,它们的格式不正确)。我尝试了几种在网上找到的不同正则表达式,例如:

$html = trim(preg_replace('/<\s+>/', '<>', $text));

和:

$html = preg_replace('/<(.+?)(?:»| |″)(.+?)>/', '<\1\2>', $text);

我正在尝试获取这样的字符串输出(在HTML标签的开头和结尾部分删除了空格:]

'<p> ¡Esto es una prueba! </p> <p> <strong> Prueba 123 </strong> </p> <p> <strong> <a href="https://matricom.net"> MATRICOM </a> </strong> </p> <p> <strong> Todas las pruebas aquí ... </strong> </p>'

背景故事:Google翻译倾向于在翻译结果中添加随机空格,这会影响HTML结构。只是在寻找一种清理标签的快速方法。我一直在寻找如何执行此操作的两天,似乎找不到适合我所寻找内容的任何东西。

php html regex preg-replace
2个回答
1
投票

在最一般的情况下,您可以使用preg_replace_callback解决方案:

$text='<p > ¡Esto es una prueba! < /p > <p> <strong > Prueba 123 </strong> </p> <p> <strong> <a href="https://matricom.net"> MATRICOM < / a> </ strong> </p> <p> <strong > Todas las pruebas aquí ... </strong > < /p>';
echo preg_replace_callback('~<[^<>]+>~u', function($m) { 
    return str_replace(' ', '', $m[0]); 
  // or,  preg_replace('~\s+~u', '', $m[0]); 
}, $text);

请参见PHP demo

但是,您可能希望创建一种模式,使其仅与Google翻译输出中实际使用的标记匹配。对于apstrong标签,它看起来像

'~<\s*(?:/\s*)?(?:p|a|strong)\s*>~u'

请参见this regex demo

详细信息

  • [<-<字符
  • \s*-0+空格
  • [(?:/\s*)?-/的可选序列,然后是0+空格
  • [(?:p|a|strong)-pastrong子字符串
  • \s*-0+空格
  • [>-一个>字符。

0
投票

这可能超出了您的需要,但是翻译HTML文件的过程(无论是MT还是人工的)都涉及通过过滤器解析HTML,该过滤器可完全隐藏/保护HTML标记不受翻译过程的影响。翻译编辑器仅允许出于语言目的移动某些标签(在您的示例中为href)。另外,在某些语言中,粗体格式可能不是理想的。

一旦对HTML进行后处理,就保持原样,只改变了文本内容。

[请注意,您可能会发现使用Google翻译时,HTML标记的内容有时也会被翻译,这会导致各种问题。

我可以更详细地解释该解决方案,请告诉我是否有兴趣。所需工具可免费获得。

© www.soinside.com 2019 - 2024. All rights reserved.