2010-08-13 8 views
3
$str = "& &svnips   Â ∴ ≈ osidnviosd & sopinsdo"; 
$regex = "/&[^\w;]/"; 
echo preg_replace($regex, "&", $str); 

인코딩되지 않은 앰퍼샌드를 모두 인코딩 된 앰퍼샌드로 바꾸려고합니다.
&sopinsdo 사이의 공백을 제거하는 것이 문제입니다.정규식에서 공백을 제거하는 이유는 무엇입니까?

왜 그런가? 당신은 (&로 대체 문자열을 교체의 끝에 공백을 추가해야하며, &

로 교체 (또는 \의 w) ("&"과 아닌 문자) 당신은이 개 문자를 검색

답변

2

정규식을 사용해야하는 이유는 무엇입니까? htmlspecialchars()을 사용하지 않으시겠습니까?

echo htmlspecialchars($str, ENT_NOQUOTES, 'UTF-8', false); 

네 번째 매개 변수에 유의하십시오. 그것은 무엇이든을 두 배 인코딩하지 말라고 알려줍니다.

$regex = '/&([^\w;])/'; 
echo preg_replace($regex, '&\1', $str); 
: 그러니까 기본적으로, 이것은 당신이 정규 표현식을 사용해야하는 경우, 당신이 할 수 &

에 기존 개체의 일부가 아닌 그 &lt;에 모든 <, &gt;에 모든 > 모든 &을 설정하지만 것

기본적으로 비 단어 문자를 저장하고 다시 추가합니다 ...

2

)

+1

이 아래 unigg의 대답과 같은 문제가 있습니다 : 그래서 당신이 얻을 수있는 몇 가지 간단한 테스트 케이스에 대한

preg_replace('/&(?!\w+;)/', '&amp;', $text); 

제대로 HTML을 탈출했다. 이로 인해 원치 않는 동작이 발생할 수 있습니다. – eldarerathis

0

그래서 당신은 제거 &sopinsdo 사이의 공간을 원하지 않는다. 그냥 하나 추가하십시오

echo preg_replace($regex, "&amp; ", $str); 
+2

사실,하지만'& $ foo' ('& foo'로 변환됩니다)에서 실패합니다. – ircmaxell

1

이 정규식은 사용자가 원하는 것을 수행합니다.

'& sopinsdo'   -> '&amp; sopinsdo' 
'&amp; sopinsdo'  -> '&amp; sopinsdo' 
'sopinsdo & foo; bar' -> 'sopinsdo &amp; foo; bar' 
'sopinsdo &foo bar' -> 'sopinsdo &amp;foo bar' 
관련 문제