Tescil marka değiştirmek için Regex

4 Cevap php

Ben regex ile biraz yardıma ihtiyacım var:

Ben bir html çıktı var ve ben bir <sup></sup> ile tüm kayıt markaları sarmak gerekir

Ben başlığında <sup> etiketi ve alt özelliklerini eklemek edemez ve tabii ki ben zaten superscripted olan yazmaçlar sarmak gerekmez.

Aşağıdaki regex HTML etiketi parçası değildir metni maçlar:

(?<=^|>)[^><]+?(?=<|$)

Ben arıyorum ne bir örnek:

$original = `<div>asd&reg; asdasd. asd<sup>&reg;</sup>asd <img alt="qwe&reg;qwe" /></div>`

Süzülmüş dize çıkış yapmalıdır:

<div>asd<sup>&reg;</sup> asdasd. asd<sup>&reg;</sup>asd <img alt="qwe&reg;qwe" /></div>

teşekkürler zaman için bir sürü!

4 Cevap

Eğer aşağıdaki sınırlama kabul Eh, burada, basit bir yoludur:

Zaten işlenmiş olan bu yazmaçlar var sağ ® sonra aşağıdaki

echo preg_replace('#&reg;(?!\s*</sup>|[^<]*>)#','<sup>&reg;</sup>', $s);

Mantık arkasında:

  1. Biz sadece bu ® değiştirin takip edilmedikleri ve ...
  2. > takip edilmedikleri simbol açmadan < sembol

Ben HTML düzenli değildir çünkü gerçekten, düzenli ifadeler yerine bir HTML çözümleyici kullanmak ve (eğer yukarıda tespit ettik içeriksel sınırlamalar görmezden) hayal edebileceğinden çok daha fazla kenar durumlarda sunacak.

Eğer kullandığınız teknoloji ne demek bilmiyorum. O kadar sonrası ise, birisi şüphesiz uygun çözümleyici tavsiye ederim.

Regex ne istediğiniz için yeterli değildir. Içeriği bir öznitelik veya öğe bir metin düğümü bir değeri olduğunda ilk tanımlamak için kod yazmak gerekir. Sonra tüm bu içeriği ile ve bazı yöntem yerine kullanmanız gerekir. Ben PHP nedir emin değilim, ama JavaScript gibi bir şey olacaktır:

content[i].replace(/\&reg;/g, "<sup>&reg;</sup>");

Ben düzenli ifadeler HTML ayrıştırmak için iyi bir yol olmadığını Brian ile katılıyorum, ama düzenli ifadeler kullanmak gerekiyorsa, sen belirteçleri dize bölme ve daha sonra her bir simgenin üzerinde regexpi çalıştırmayı deneyebilirsiniz.

Ben ifade <sup>&reg</sup> üzerine preg_split HTML etiketleri dize bölmek için kullanarak, hem de kulüpler - bu ya zaten simge {[(2)] olmayan metni bırakacak } veya belirteçleri gibi bir etiket. Daha sonra her bir belirtecinin, &reg; ile ikame edilmiş olabilir <sup>&reg;</sup>,

$regex = '/(<sup>&reg;<\/sup>|<.*?>)/i';
$original = '<div>asd&reg; asdasd. asd<sup>&reg;</sup>asd <img alt="qwe&reg;qwe" /></div>';

// we need to capture the tags so that the string can be rebuilt
$tokens = preg_split($regex, $original, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
/* $tokens => Array
(
    [0] => <div>
    [1] => asd&reg; asdasd. asd
    [2] => <sup>&reg;</sup>
    [3] => asd
    [4] => <img alt="qwe&reg;qwe" />
    [5] => </div>
)
*/

foreach ($tokens as &$token)
{
    if ($token[0] == "<") continue; // Skip tokens that are tags
    $token = substr_replace('&reg;', '<sup>&reg;</sup>');
}

$tokens = join("", $tokens); // reassemble the string
// $tokens => "<div>asd<sup>&reg;</sup> asdasd. asd<sup>&reg;</sup>asd <img alt="qwe&reg;qwe" /></div>"

Bu naif bir yaklaşım olduğunu, ve beklendiği gibi çıktı biçimlendirilmiş değilse sizin istediğiniz gibi (düzenli ifade ;) HTML ayrıştırma için iyi değil, tekrar) ayrıştırmak olmayabilir unutmayın