2017-04-21 6 views
1

저는 액센트를 유지하면서 영숫자가 아닌 문자를 필터링하는 방법을 이미 알았지 만 구두점과 일반적인 키보드 문자를 어떻게 유지할 수 있습니까? % $ # & @ *) [] :;/- + _ =.,PHP 정규식은 영숫자 라틴 문자, 문장 부호 및 html로만 유지됩니다

또한 문자열에서 모든 HTML 태그와 BR 줄 바꿈을 유지해야합니다. 이것이 가능한가 ?

$caption = preg_replace('/[^\p{Latin}\d\s\p{P}]/u', '', $caption); 
+0

어쩌면 <\/?.+?> (* SKIP) (* FAIL)'과 같은 | [^ \ P {라틴어 } \ d \ s \ p {P}]'그것은 HTML 요소라는 것을 실제로 검증하지는 않습니다. 단지 그 사이에 뭔가가있는'<' and a '> '을 가지고 있습니다. – chris85

답변

1

이렇게하면됩니다. 모든 특수 키보드 문자 및 모두를 유지합니다. html 태그
및 기타 항목 만 대상으로합니다.

정규 표현식은 태그와 특수 문자에 대해 원자 그룹을 사용합니다.
결과는 매우 빨라야합니다.

현악기와 구분 된 형태 '~..~' :

'~(?>(?><(?:(?:(?:(script|style|object|embed|applet|noframes|noscript|noembed)(?:\s+(?>"[\S\s]*?"|\'[\S\s]*?\'|(?:(?!/>)[^>])?)+)?\s*>)[\S\s]*?</\1\s*(?=>))|(?:/?[\w:]+\s*/?)|(?:[\w:]+\s+(?:"[\S\s]*?"|\'[\S\s]*?\'|[^>]?)+\s*/?)|\?[\S\s]*?\?|(?:!(?:(?:DOCTYPE[\S\s]*?)|(?:\[CDATA\[[\S\s]*?\]\])|(?:--[\S\s]*?--)|(?:ATTLIST[\S\s]*?)|(?:ENTITY[\S\s]*?)|(?:ELEMENT[\S\s]*?))))>|[!%$#&@*()\[\]^:;/+_=.,\~-])(*SKIP)(*FAIL))|[^\p{Latin}\d\s\p{P}]~'

원시 형태 :

(?>(?><(?:(?:(?:(script|style|object|embed|applet|noframes|n‌​oscript|noembed)(?:\‌​s+(?>"[\S\s]*?"|'[\S‌​\s]*?'|(?:(?!/>)[^>]‌​)?)+)?\s*>)[\S\s]*?<‌​/\1\s*(?=>))|(?:/?[\‌​w:]+\s*/?)|(?:[\w:]+‌​\s+(?:"[\S\s]*?"|'[\‌​S\s]*?'|[^>]?)+\s*/?‌​)|\?[\S\s]*?\?|(?:!(‌​?:(?:DOCTYPE[\S\s]*?‌​)|(?:\[CDATA\[[\S\s]‌​*?\]\])|(?:--[\S\s]*‌​?--)|(?:ATTLIST[\S\s‌​]*?)|(?:ENTITY[\S\s]‌​*?)|(?:ELEMENT[\S\s]‌​*?))))>|[!%$#&@*()\[‌​\]^:;/+_=.,~-])(*SKI‌​P)(*FAIL))|[^\p{Lati‌​n}\d\s\p{P}]