更改标签关闭的位置

时间:2018-04-15 16:18:04

标签: php regex

我有一个带有html内容的字符串,其中的链接位于错误的位置,我需要将其放在正确的位置。让我解释一下这种模式:

所有链接后跟一个<sup>标记或*。我需要在a*之后关闭</sub>代码。例如:

<a href="#" class="ddb1"><sup id="v3534" class="ddb17">34</sup> No harás impura la tierra en que habitáis, porque yo habito en medio de ella, pues yo, Yahvé, tengo mi morada entre los israelitas.»</a>

应该是这样的:

<a href="#" class="ddb1"><sup id="v3534" class="ddb17">34</sup></a> No harás impura la tierra en que habitáis, porque yo habito en medio de ella, pues yo, Yahvé, tengo mi morada entre los israelitas.»

La herencia de la mujer casada<a href="notas04nm.xhtml#nnm170ref" class="ddb1">*.</a>

应该是:

La herencia de la mujer casada<a href="notas04nm.xhtml#nnm170ref" class="ddb1">*</a>.

问题是,字符串中的*sup标记可能没有内部链接,因此,我无法删除</a>并替换{ {1}} **</a> </sup>。所以,我认为正确的方法是使用Regex,但我对此非常不满。

非常好地表示真实字符串的示例字符串是:

</sup></a>

注意:

该字符串包含拉丁字符,如<sup id="v3530" class="ddb17">30</sup> «En cualquier caso de homicidio, se matará al homicida según la declaración de los testigos; pero un solo testigo no bastará para condenar a muerte a un hombre*. <sup id="v3531" class="ddb17">31</sup> No aceptaréis rescate por la vida de un homicida reo de muerte, pues debe morir. <sup id="v3532" class="ddb17">32</sup> Tampoco aceptaréis rescate por el que se ha refugiado en la ciudad de asilo y quiere volver a habitar en su tierra antes que muera el Sumo Sacerdote. <a href="#" class="ddb1"><sup id="v3533" class="ddb17">33</sup> No profanaréis la tierra en que estáis, porque aquella sangre profana la tierra, y la tierra no queda expiada de la sangre derramada más que con la sangre del que la derramó. </a><a href="#" class="ddb1"><sup id="v3534" class="ddb17">34</sup> No harás impura la tierra en que habitáis, porque yo habito en medio de ella, pues yo, Yahvé, tengo mi morada entre los israelitas.»</a> La herencia de la mujer casada<a href="notas04nm.xhtml#nnm170ref" class="ddb1">*.</a>

修改

我有这段代码适用于前2个示例但不适用于第3个示例(那个代码是真实字符串的示例):

áéíóúñ

1 个答案:

答案 0 :(得分:1)

可以(不是说你应该)使用以下表达式:

<a[^>]*>(?:\*|<sup[^>]*>.*?</sup>)\K(.*?)</a>

这需要替换为

</a>$1

请参阅a demo on regex101.com(并注意修饰符!)。

<小时/> 细分,这写着:

<a[^>]*>                   # likely an opening anchor tag
(?:\*|<sup[^>]*>.*?</sup>) # * or <sup...>...</sup>
\K                         # forget what's been matched thus far
                           # (but remember the position)
(.*?)                      # match anything lazily...
</a>                       # ... up to </a>

但是,请考虑使用解析器和DOM函数,因为这有点hacky且容易出错嵌套标记和属性(即data-tags)。