2014-08-29 8 views
1

다음 코드가 있습니다. 내가 대체하기 위해 노력하고있어str_ireplace가 URL의 일부가 아닌지 확인하려면 어떻게해야합니까?

$array = ["example","exam ple"]; 
$message = str_ireplace($array, 'ExamPle', $message); 

는이 데이터베이스에 삽입되기 전에, 세이브 사전에 그것의 귀여운 스타일 화 된 버전으로 내 웹 사이트의 이름을 언급하고있다.

내 웹 사이트 이름에 대한 언급이 URL의 일부인 경우 (도메인 이름이 웹 사이트 이름이기 때문에) 링크를 바꾸면 링크가 깨집니다.

URL을 바꾸지 않아도되는 것을 어떻게 수정할 수 있습니까?

사용자의 게시물을 배열로 분해하고 일종의 filter_var ($ string, FILTER_VALIDATE_URL)을 수행하는 방법을 생각했습니다. 그러나 그것은 삐죽 삐죽하고 상당히 낭비적인 것처럼 보였다.

Regex가 대답입니까? preg_match_all을 사용하고 있습니까?

감사합니다.

답변

1

URL이 www.example.com이거나 단지 http://example.com이라고 가정합니다. 이러한 패턴의

지금, 당신의 필요에 따라 선택할 수있는 하나 http://, https:// 또는 www.가 선행되지

예를 : (?<!http://|https://|www\.)example
.com 다음에하지 : example(?!\.com)

다음과 같이 두 번째 패턴을 사용하여 스타일이 적용된 스타일로 대체하십시오 (

).
preg_replace('#example(?!\.com)#i', 'ExamPle', $message) 

대소 문자를 구분하지 않으려면 패턴을 # ... #i으로 묶습니다.

두 번째 패턴은 더 나은 결과를 제공해야하는 example.com의 독립 실행 형 언급을 제외합니다. 사용자가 게시 한 콘텐츠가 있다고 가정 해 보겠습니다. 여기에 ... example.com에 대해 내가 좋아하는 것은 bla bla bla ...입니다. 이 경우 두 번째 패턴은 예 : 단어를 대체하지 않지만 첫 번째 패턴은 그렇습니다. 나는이 상황에서 소문자로 남아 있어야한다고 생각한다.

이제 http://something/example/something과 같은 문자열의 경우가 있는데, 두 가지 방법으로 해결할 수 있습니다.

최초의 솔루션 :

(?:https?:\/\/|www\.)\S+(*SKIP)(*FAIL)|example(?!\.com) 

Demo

이, URL을 일치하는 전체 URL을 소모하고, URL의 끝에 오프셋 다음 시작을 설정하는 동안 다음 경기를 실패하여 작동합니다.

코드 :

preg_replace('#(?:https?:\/\/|www\.)\S+(*SKIP)(*FAIL)|example(?!\.com)#i', 'ExamPle', $message) 

둘째 솔루션, 당신이 되돌아 동사 편안하지 않은 경우 :

(?:https?:\/\/|www\.)\S+|(example(?!\.com)) 

See here이 패턴과 일치하는 방법에 대한 아이디어를 얻을. 기본적으로 URL은 대체 URL의 왼쪽과 일치하며 바꿀 문자열은 오른쪽과 일치하여 캡처됩니다.

나는 PHP가 설치되어 있지 않은 내가 마지막으로 사용 된 이후 몇 년이되었습니다하지만,이 같은 일을해야 :

preg_replace_callback(
    '#(?:https?:\/\/|www\.)\S+|(example(?!\.com))#i', 
    function ($matches) { 
     if ($matches[1]) 
      return "ExamPle"; 
     return $matches[0]; // Do not substitute 
    }, 
    $message) 
+0

안녕하세요, 감사합니다. 나는 URL의 일부인 것을 대체하려고하지 않고있다. 나는 URL의 일부를 구성하지 않는 어커런스를 대체하려고 노력 중이므로 URL을 깨뜨리지 않습니다. 예를 들어 누군가가 예를 들어 바위라고 말하면 대체 될 것입니다. 만약 그들이 http://example.com이 말하면, 그것은 대체되지 않을 것입니다. –

+0

오, 고마워, 나는이 일을 줄 것이다. 귀하의 편집 내용이 귀하가 원하는 솔루션임을 분명하게 나타냅니다. –

+0

실제로'(?

-1

$ 배열에 'www'또는 'http'가 없으면 대체 코드를 사용합니다. 아니면 비슷한.

0

간단한 방법, 당신은 당신이 정확히 텍스트를 거 알아 경우 "바꾸지 않기"를 시도하는 것은 더미 값을 사용하는 것입니다. 더미 값으로 안전하게 유지하려는 텍스트를 바꾸고 실제 검색/바꾸기를 수행 한 다음 더미 값을 안전한 텍스트로 바꿉니다. 이와 같이 :

$message = "This is http://www.example.com/index.html example text exam ple"; 
$array = ["example","exam ple"]; 
$url = "http://www.example.com"; 
$dummy = "**23ew0fjw0effw09ef0w9e8f0e9w**"; 

$message = str_ireplace([$url], $dummy, $message); 
$message = str_ireplace($array, 'ExamPle', $message); 
$message = str_ireplace($dummy, $url, $message); 

더미 텍스트는 매우 높은 확률로 텍스트에 절대 나타나지 않아야합니다. 가능한 형태가 여러 개인 경우 preg_replace으로 검색 할 수도 있습니다. 모든 형식의 URL을 하나의 표준 형식으로 대체 할 수 있다면이 간단한 기술이 여전히 작동합니다. 원본 텍스트에 나타나는 URL의 양식을 정확하게 대체해야하는 경우 각 양식이 정확하게 기록되는 약간 더 복잡한 기술이 필요합니다.

이 대체품 - 바꾸기 - 가짜 - 할일 - 할 - 할 일은 항상 약간 어수선하게 보입니다. 그러나 놀랍도록 잘 작동합니다. 저는 환상적인 이름을 가진 Schwartzian Transform과 크게 다르지 않습니다.

관련 문제