2012-08-27 4 views
0

일부 URL이 포함될 수있는 텍스트의 단어 목록을 바꾸려면 preg_replace를 사용하고 있습니다. 문제는 URL의 일부인 경우이 단어를 대체하고 싶지 않다는 것입니다.preg_replace 단어가 URL 내에 없음

이러한 예는 무시되어야한다

foo.com

foo.com/foo

foo.com/foo/foo

염기성 (예를 들면, PHP로 작성), 난 .com 및 선택적 슬래시와 문자를 포함하는 문자열을 무시하려고, 네가 봐 미리 엉덩이를 사용하여 ,하지만 성공 ertion :

preg_replace("/(\b)foo(\b)/", "$1bar$2(?!(\w+\.\w+)*(\.com)([\.\/]\w+)*)", $text);

이 호출 작동은 .COM 전에 단어를 무시합니다. 도움이 될 것입니다.

답변

0

이와 같은 경우에는 문제를 거꾸로 생각하는 것이 훨씬 쉽습니다. URL에 이 아닌 단어를 일치시키고 싶습니다. 대신, 당신은 단어 을 일치시키고 싶다고 생각합니다. 그래서 표현식은 다음과 같을 것입니다 : url_match_here|(?:my|words|here). 이렇게하면 정규식 엔진이 URL을 먼저 소비 한 다음 해당 단어를 일치 시키려고합니다. 따라서 URL 내부의 단어와 일치하는 것에 대해 걱정할 필요가 없습니다. 텍스트 구조를 유지하려면 preg_replace을 다음 표현식 (url_match_here)|(?:my|words|here)과 함께 사용하고 \1을 URL 및 텍스트를 유지하기 위해 바꿀 수 있습니다.

이 정보가 도움이되기를 바랍니다.

행운을 비네.

+0

나는 그것을 달성하는 방법에 대해 잘 모르겠습니다. 두 번째 옵 션이 일치 할 때만 대체품을 만들 수 있습니까? 예를 들어 ** foo foo.com **은 ** bar foo.com ** 을 생성하지만 솔루션은 ** bar foo.com bar ** – savioret

+0

을 생성합니다. 마지막으로이 방법을 사용하여 문제를 해결할 수 있었지만 preg_replace_callback 함수를 사용하여 문자열의 버려진 부분을 소비 할 수 있었고 콜백 내부에서 처리 중이거나 일치하는 문자열이 아닌지를 결정했습니다. – savioret

+0

다행 이니 다행입니다. 나는 당신의 코멘트를 완전히 놓쳤다, 미안. –