Nasıl dizeleri link etiketinin içinde değil değiştirebilirsiniz?

2 Cevap php

Bu PHP fonksiyonu üzerinde çalışıyorum. Fikir (bir dizide verilen iki, kelime ve etiketleri,) belirli etiketleri içine bir dize meydana gelen bazı kelimeleri sarılmasıdır. Bu! Tamam çalışır, ancak bu kelimeler bir bağlantılı metin ya da 'src' niteliğine meydana geldiğinde, o zaman tabii bağlantı kırık ve etiketleri ile doldurulmuş, ya da bir bağlantı içinde olmamalıdır etiketleri oluşturulur. Bu şimdi ne var:

function replace() {
  $terminos = array (
  "beneficios" => "h3",
  "valoracion" => "h2",
  "empresarios" => "h2",
  "tecnologias" => "h2",
  "...and so on..." => "etc",
  );

  foreach ($terminos as $key => $value)
  {
  $body = "string where the word empresarios should be replaced; but the word <a href='http://www.empresarios.com'>empresarios</a> should not be replaced inside <a> tags nor in the URL of their 'src' attribute.";
  $tagged = "<".$value.">".$key."</".$value.">";
  $result = str_replace($key, $tagged, $body);
  }
}

Bu fonksiyon, bu örnekte, döndürmelidir "string where the word <h2>empresarios</h2> should be replaced; but the word <a href='http://www.empresarios.com'>empresarios</a> should not be replaced inside <a> tags nor in the URL of their 'src' attribute."

Ben dize düşünce tüm bu iş için yedek işlevi gibi, ama onun nitelikleri değil içeride etiketleri nor! Ediyorum

(Ben bunu ne gerek javascript olmadığını sadece, aşağıdaki parçacığı belirtilen ne yapmak isterdim, ama PHP: /questions/1666790/how-to-replace-text-not-within-a-specific-tag-in-javascript)

2 Cevap

DOM kullanmak ve yalnızca metin düğümleri değiştirin:

$s = "foo <a href='http://test.com'>foo</a> lorem bar ipsum foo. <a>bar</a> not a test";
echo htmlentities($s) . '<hr>';

$d = new DOMDocument;
$d->loadHTML($s);

$x = new DOMXPath($d);
$t = $x->evaluate("//text()");

$wrap = array(
    'foo' => 'h1',
    'bar' => 'h2'
);

$preg_find = '/\b(' . implode('|', array_keys($wrap)) . ')\b/';

foreach($t as $textNode) {
    if( $textNode->parentNode->tagName == "a" ) {
        continue;
    }

    $sections = preg_split( $preg_find, $textNode->nodeValue, null, PREG_SPLIT_DELIM_CAPTURE);

    $parentNode = $textNode->parentNode;

    foreach($sections as $section) {  
        if( !isset($wrap[$section]) ) {
            $parentNode->insertBefore( $d->createTextNode($section), $textNode );
            continue;
        }

        $tagName = $wrap[$section];
        $parentNode->insertBefore( $d->createElement( $tagName, $section ), $textNode );
    }

    $parentNode->removeChild( $textNode );
}

echo htmlentities($d->saveHTML());

Gerektiği gibi DOMText ve DOMElement ile DOMText yerine düzenlenebilir.

Eğer JS, sivri cevap için, temelde aynı. Sen sadece bir dize var belirtmeniz gerekir.

$regexp = "/(<pre>(?:[^<](?!\/pre))*<\/pre>)|(\:\-\))/gi";

Ayrıca o harfle ihtimaline kelime 'Empresarios' (Empresarios) değiştirin ya da garip şeyler (Empresarios) gibi başka preg_replace işlevini gerekiyor olabilir unutmayın.

Ayrıca HTML ilgileneceğim. <h2> blok unsurlardır ve bu şekilde yorumlanır olabilir:

dize nerede kelime empresarios değiştirilmelidir;

Ve değiştirilmesi

dize nerede kelime

empresarios

değiştirilmelidir;

Belki de ne kullanmak gerekir bir <big> etikettir.