문제

이 정규식을 만들었습니다.

(www|http://)[^ ]+

그 모든 일치 http://... 또는 www.... 하지만 preg_replace를 작동하게 만드는 방법을 모르겠어서 시도해 보았습니다.

preg_replace('/((www|http://)[^ ]+)/', '<a href="\1">\1</a>', $str);

하지만 작동하지 않습니다. 결과는 빈 문자열입니다.

도움이 되었습니까?

해결책

구분기로 슬래시를 사용하고 있기 때문에 Regex에서 슬래시를 피해야합니다. 다른 기호를 구분 기호로 사용할 수도 있습니다.

// escaped
preg_replace('/((www|http:\/\/)[^ ]+)/', '<a href="\1">\1</a>', $str);

// another delimiter, '@'
preg_replace('@((www|http://)[^ ]+)@', '<a href="\1">\1</a>', $str);

다른 팁

다른 사용자가 제공 한 REGEX 코드를 사용하는 경우 "I"플래그를 추가하여 케이스 감도를 활성화하므로 http : // 및 http : // 모두에서 작동합니다. 예를 들어, Chaos의 코드 사용 :

preg_replace('!(www|http://[^ ]+)!i', '<a href="\1">\1</a>', $str);

우선, 다른 답변에서 설명한대로 구속자를 탈출하거나 더 잘 교체해야합니다.

preg_replace('~((www|http://)[^ ]+)~', '<a href="\1">\1</a>', $str);

둘째, 정규식을 더욱 향상시키기 위해 $n 교체 참조 구문이 선호됩니다 \\n, 수동.

preg_replace('~((www|http://)[^ ]+)~', '<a href="$1">$1</a>', $str);

셋째, 캡처 괄호를 사용하는 것은 불필요하게 물건을 느리게 만듭니다. 그들을 제거. 업데이트하는 것을 잊지 마십시오 $1 에게 $0. 궁금한 점이 있다면, 이들은 획득하지 않는 괄호입니다. (?: ).

preg_replace('~(?:www|http://)[^ ]+~', '<a href="$0">$0</a>', $str);

마지막으로, 나는 교체 할 것이다 [^ ]+ 더 짧고 정확합니다 \S, 그것은 반대입니다 \s. 주목하십시오 [^ ]+ 공간을 허용하지 않지만 Newlines와 탭을 수락합니다! \S 하지 않습니다.

preg_replace('~(?:www|http://)\S+~', '<a href="$0">$0</a>', $str);

주요 문제는 모든 것을 괄호 안에 넣어서 "\1"이 무엇인지 알 수 없다는 것입니다.또한 "/"를 이스케이프해야 합니다.그러니 이것을 시도해 보세요:

preg_replace('/(www|http:\/\/[^ ]+)/', '<a href="\1">\1</a>', $str);

편집하다:실제로 괄호는 문제가 아닌 것 같습니다. 제가 잘못 읽었습니다.다른 사람들도 지적했듯이 탈출은 여전히 ​​​​문제였습니다.두 가지 솔루션 중 하나가 작동해야 합니다.

preg_replace('!((?:www|http://)[^ ]+)!', '<a href="\1">\1</a>', $str);

당신이 사용할 때 / 당신의 패턴은 구분자로서 / 당신의 패턴 내부는 잘 작동하지 않습니다. 나는 이것을 사용하여 이것을 해결했다 ! 패턴 구분자로서, 대신 슬래시를 피할 수 있습니다.

나는 또한 당신이 두 개의 Paren 캡처를하고있는 이유를 보지 못했기 때문에 그중 하나를 제거했습니다.

상황에서 문제의 일부는 당신이 경고를 억제하면서 달리고 있다는 것입니다. 당신이 있었다면 error_reporting(E_ALL) ON은 PHP가 Regex에서 Delimiter 문제에 대해 생성하려는 메시지를 보았을 것입니다.

공백 대신 줄 바꿈으로 구분된 문자열 a에 여러 개의 URL이 포함된 경우 \S를 사용해야 합니다.

preg_replace('/((www|http:\/\/)\S+)/', '<a href="$1">$1</a>', $val);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top