regex (PHP) maç & için

5 Cevap php

& Ile tüm bağımsız ve işaretleri değiştirmek için: İşte hedeftir ama zaten böyle bir HTML varlığın parçası olanlar yerine DEĞİLDİR.

Ben sadece bağımsız ve işaretleri maç olacak (tercihen preg_ işlevleri için) PHP için normal bir ifade gerekir düşünüyorum. Ben sadece preg_replace ile bunu nasıl bilmiyorum.

5 Cevap

Sen her zaman çalıştırmadan önce html_entity_decode çalıştırmak htmlentities? Olabilir Sadece ve işareti yapmak (ve hatta daha sonra charset parametreleri ile oynayabilir) istemedikçe çalışır.

Çok daha kolay ve bir regex daha hızlı.

PHP'nin htmlentities() Bunun için double_encode argümanı var.

Normal ifadelerde böyle şeyler yapmak istiyorsanız, o zaman olumsuz iddialar yararlı gelir:

preg_replace('/&(?![a-z#]+;)/i','&',$txt);

Ross iyi bir cevap götürdü. Burada oldukça iyi iş gibi görünüyor kod. Şimdiye kadar. Hedefi :-), yine, özellikle RSS beslemeleri için açıklamaları, XML dönüştürmek HTML. (Bazı oldukça oldukça ilginç verilerle) şimdiye kadar yaptığım kısa test ben CDATA'da sarılmış dizeleri almak ve açmak mümkün oldum. Doğrulama testleri geçer. Teşekkürler, Ross.

//decode all entities
$string=html_entity_decode($string,ENT_COMPAT,'UTF-8');

//entity-encode only &<> and double quotes
$string=htmlspecialchars($string,ENT_COMPAT,'UTF-8');

Diğerleri iyi öneri, ve bunu yapmak için daha iyi bir yol olabilir. Sadece bir regex örnek sağlamak için ise - Ama ben sordu soruyu cevaplamak için denemek istiyorum düşündüm.

Aşağıda bazı motorlarda izin özel ayrılmış şeklidir. Tabii ki tek şey olduğunu yorumladı regexes diğer basitleştirilmiş expresssions izin veren bir motor - ama genel olarak. Ben yorumlarda Pars bu basitleştirilmiş ifadeler koyacağım.

&                      # an ampersand
( \#                   # a '#' character
  [1-9]                # followed by a non-zero digit, 
  [0-9]{1,3}           # with between 2 and 4             (\d{1,3} or \p{IsDigit}{1,3})
| [A-Za-z]             # OR a letter                      (\p{IsAlpha})
  [0-9A-Za-z]+         # followed by letters or numbers   (\p{IsAlnum}+)
)
;                      # all capped with a ';'

Hatta regex tarayıcı yardım etmek, hem de orada beklenen kişilerin bir demet atmak olabilir.

&                      # an ampersand
( amp | apos | gt | lt | nbsp | quot                 
                       # standard entities
| bull | hellip | [lr][ds]quo | [mn]dash | permil          
                       # some fancier ones
| \#                   # a '#' character
  [1-9]                # followed by a non-zero digit, 
  [0-9]{1,3}           # with between 2 and 4 
|  [A-Za-z]            # OR a letter
  [0-9A-Za-z]+         # followed by letters or numbers
)
;                      # all capped with a ';'

: Aslında kullanıyordum ben, aynı sorun vardı

$string = htmlspecialchars($string, ENT_QUOTES, "UTF-8", FALSE);

Ama ile sona erdi, bu PHP4 ve karakter setlerinin bir karışımı ile çalışmak gereklidir:


function htmlspecialchars_custom($string)
{
  $string = str_replace("\x05\x06", "", $string);
  $string = preg_replace("/&([a-z\d]{2,7}|#\d{2,5});/i", "\x05\x06$1", $string);
  $string = htmlspecialchars($string, ENT_QUOTES);
  $string = str_replace("\x05\x06", "&", $string);

  return $string;
}

Bu mükemmel, ama benim ihtiyaçları için yeterince iyi değil.