在HTML中为所有英文文本添加一个类?

时间:2017-01-06 07:40:52

标签: php simple-html-dom

要求是在页面上的所有英语单词周围添加一个englishText类。问题类似于this,但Javascript解决方案对我不起作用。我需要一个PHP示例来解决此问题。例如,如果你有这个:

<p>Hello, 你好</p>
<div>It is me, 你好</div>
<strong>你好, how are you</strong>

之后我需要结束:

<p><span class="englishText">Hello</span>, 你好</p>
<div><span class="englishText">It is me</span>, 你好</div>
<strong>你好, <span class="englishText">how are you</span></strong>

还有更复杂的案例,例如:

<strong>你好, TEXT?</strong>
<div>It is me, 你好</div>

这应该成为:

<strong>你好, <span class="englishText">TEXT?</span></strong>
<div><span class="englishText">It is me</span>, 你好</div>

但是一旦我知道如何正确地迭代文档,我想我可以理清这些边缘情况。

我无法使用javascript解决此问题,因为:

  1. 这需要适用于不支持javascript的浏览器
  2. 我更希望在页面加载时使用这些类,因此使用正确的字体呈现文本没有任何延迟。
  3. 我认为迭代文档的最佳方法是使用PHP Simple HTML DOM Parser

    但问题是如果我试试这个:

    foreach ($html->find('div') as $element)
    {
        // make changes here
    }
    

    我担心以下情况会引起混乱:

    <div>
           Hello , 你好
           <div>Hello, 你好</div>
    </div>
    

    正如您所看到的,它将进入第一个div,然后如果我处理该节点,我也将在其中处理该节点。

    任何想法如何解决这个问题,只选择一次处理节点?

    更新

    我现在意识到我真正需要的是一种递归方式来迭代HTML元素,并能够在迭代它们时更改它们。

1 个答案:

答案 0 :(得分:0)

你应该以{{1​​}}的方式旅行,这样你就不会遇到这样的情况......

类似的东西:

siblings

或者更轻松的方式imo:

只是......

  1. 使用<?php foreach ($html->find('div') as $element) { foreach($element->next_sibling() as $sibling){ echo $sibling->plaintext()."\n"; } } ?> ;
  2. 将每个<*>更改为"\n"."<*>"
  3. 制作一系列像preg_replace()
  4. 这样的行

    3

    $lines = explode("\n",$html_string);