【问题标题】:How to replace spaces inside of HTML tags while keeping the tags in PHP (preg_replace)?如何替换 HTML 标签内的空格,同时将标签保留在 PHP(preg_replace)中?
【发布时间】:2020-06-25 22:06:55
【问题描述】:

假设我有这个字符串:

$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


    【解决方案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

    详情

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

    【讨论】:

    • 你是救生员!感谢您的第二部分,这解决了“a href”空间被删除的问题。杰出的。谢谢!
    【解决方案2】:

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

    经过后处理后,HTML 将保持原样,仅更改文本内容。

    请注意,您可能会发现使用 Google 翻译有时也会翻译 HTML 标签的内容,这会给您带来各种问题。

    我可以更详细地解释解决方案,如果感兴趣,请告诉我。所需的工具可以免费获得。

    【讨论】:

    • 你在回答什么问题?
    • 也许不清楚,但谷歌翻译在 HTML 标记中添加空格的问题 - 我提出了一个解决方案来防止这种情况发生。
    • 我最终将文本与 HTML 分离,翻译文本,然后重新创建 DOM 来解决这个问题。它还减少了发送给翻译人员的字符数。虽然 Witkor 的回答解决了我眼前的问题,但后来它变得更加复杂,所以我采用了这个更复杂的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 2015-04-11
    • 2021-08-16
    • 1970-01-01
    • 1970-01-01
    • 2010-12-23
    相关资源
    最近更新 更多