2016-03-24 6 views
0

Şimdi bütün gün beni rahatsız ediyor. Bu basit olmayan geçerli HTML ŞimdiPHP Çoklu HTML Regex'i aramak ve iç html'yi değiştirmek gerekiyor

<p clneck="something">my neck hurts</p> 

varsayalım ben Elbette head

ile neck yerine preg_replace kullanmak istiyorum basit

preg_replace("/neck/", "head") 

bana

<p clhead="something">my head hurts</p> 
verecekti

Sanırım Konu sende.

DOMDocument içinde yapıyı denedim, ancak iki kez başarısız oldu: HTML5 için oluşturulmuyor ve yine de bazı göksel iç içe geçmiş etiketlerde başarısız oluyor.

+0

Nasıl başarısız oldu? Ne denedin? Neden bu regex ile 'kafa' '' '' '' '' '' '' '' Bunlar aynı zamanda çokbaytlı karakterler değildir .. – chris85

+1

Her şeyden önce [preg_replace] 'yı nasıl kullanacağınızı kontrol edin (http://www.tutorialspoint.com/php/php_preg_replace.htm). Üçüncü parametre eksik. @ chris85: Soruyu düzenledim, bu yüzden şimdi boyun: D –

+0

@noob aha biraz daha mantıklı. 'Class' özniteliğini eşleşecek, regex davranışını değiştirdim. Multibyte sorunu ve OPs kullanımları konusunda hala net değil. – chris85

cevap

0

$1 gibi geri dönüşler kullanılarak yapılabilir.

Basit bir örnek sadece taşıma p etiketler:

$input = '<p clneck="something">my neck hurts</p>'; 
$output = preg_replace('/(<p\s+[^>]+>[^<]*)neck([^<]*<\/p>)/i', '$1head$2', $input); 

biz de eşleştirme regex başvuruları (\\2) gerekir, çünkü bu biraz daha karmaşık hale Tüm etiketleri işlemek için:

$input = '<p clneck="something">my neck hurts</p><div idneck="foo">my neck hurts, too</div>'; 
$output = preg_replace('/(<(\w+)(\s+[^>]+)>[^<]*)neck([^<]*<\/\\2>)/i', '$1head$4', $input); 
echo $output; 
+0

Fena değil. Ama görebildiğim kadarıyla (test etmeden önce), bu sadece

'u ele alacaktır. - Diğer tüm etiketler ne olacak? – Juergen

+0

Her tür etiketi işlemek için cevabımı değiştirdim. – maxhb