2011-05-15 2 views
1

나는이 코드를 가지고있다.이 정규식이이 단어를 제외하지 않는 이유는 무엇입니까?

$str=preg_replace(
    '#\b[^"](Hello User)#',   
    '<a href="$1">$1</a>', 
    $str); 
return nl2br($str); 

그래서, "로 시작하는 모든 Hello User을 대체하고 싶다.

Hello User\n 
"Hello User\n 
Hello User\n 
"Hello User"\n 

이 결과는 다음과 같이 나타낼 것입니다 :

<a href="Hello User">Hello User</a><br /> 
"Hello User<br /> 
<a href="Hello User">Hello User</a><br /> 
"Hello User"<br /> 

실제로 출력은 반대입니다 :

Hello User<br /> 
"<a href="Hello User">Hello User</a><br /> 
Hello User<br /> 
"<a href="Hello User">Hello User</a>"<br /> 

왜? 어떻게이 문제를 해결할 수 있습니까?

EDIT

여기에 예제가 있습니다. http://codepad.org/2Q466lx2

답변

2

이유는 [^"]가 문자를 (A " 아무것도하지만)와 일치하는 기대 때문이다. 첫 번째 Hello User이 문자열의 시작 부분에 있기 때문에 오류가 발생합니다. 이것은 그것이 "가 선행되지 않은 경우에만 Hello User 일치

$str=preg_replace(
    '#(?<!")(Hello User)#',   
    '<a href="$1">$1</a>', 
    $str); 

:

대신 부정적인 lookbehind 주장을 사용합니다.

+0

음 없음을! 이 모든 Hello 사용자를 사용하면 O – kwichz

+0

팀의 솔루션이 작동합니다. – LeleDumbo

+0

정말요? 아니 그것은 작동하지 않습니다 (또는 어쩌면 당신이 내 질문을 오해 :)). 이걸 한번 확인해보십시오 http://codepad.org/2Q466lx2 : 마지막''Hello User' (앞에''')가 붙습니다 : O – kwichz

1

기능를 htmlentities() "&quot; 시도로 변환 :

#(?<!&quot;)(Hello User)# 
관련 문제