2013-02-24 2 views
2

preg_replace 역 참조를 사용하는 방법을 이해하는 데 큰 문제가 있습니다.PHP - preg_replace 역 참조

나는 일반 텍스트 문자열을 가지고 있으며 모든 링크를 링크의 HTML 구문으로 대체하려고합니다. 따라서 "www.mydomain.tld"또는 "http://www.mydomain.tld"또는 "http://mydomain.tld"을 HTML a- 태그로 묶어야합니다. 이 온라인 작업 기능을 찾았지만 직접 수행하는 방법을 알고 싶습니다. I 일부가 거기에 인용 부호를 배출 참조

"\\1<a href=\"http://\\2\" target=\"_blank\" rel=\"nofollow\">\\2</a>" 

이러한 비트 : \\1\\2 I 발견 기능에

,이 교체된다.
PHP 설명서에 따르면 이는 역 참조입니다. 그러나 어떻게 그들을 사용합니까, 그들이 무엇을합니까?

사양에 대한 내용이 없으므로 도움을 주시면 대단히 감사하겠습니다.

+0

본 적이 있습니까? http://php.net/manual/en/regexp.reference.back-references.php 또는 http://www.regular-expressions.info/brackets.html? – elclanrs

+0

이것은 역 참조가 아닙니다. 이 컨텍스트에서는 일치하는 그룹 자리 표시 자입니다. – mario

답변

3

이것은 당신을 위해 일을 할 것입니다. 어떻게 작동하는지에 대한 설명은 아래를 참조하십시오.

$string = 'some text www.example.com more text http://example.com more text https://www.example.com more text'; 

$string = preg_replace('#\b(?:http(s?)://)?((?:[a-z\d-]+\.)+[a-z]+)\b#', "<a href='http$1://$2'>http$1://$2</a>", $string); 

echo $string; // some text <a href='http://www.example.com'>http://www.example.com</a> more text <a href='http://example.com'>http://example.com</a> more text <a href='https://www.example.com'>https://www.example.com</a> more text 

\b 일치하는 단어 경계 (?:http(s?)://)? 선택적으로 일치하는 문자열 HTTPS는 's' 그래서 우리는 올바른 URL

(?:[a-z\d-]+\.)+ 일치 하나의 편지 시리즈의 더 많은 발생을 구축 할 수 있습니다 잡아 경우는, 'http://' 또는 'https://' 포함 된 경우/숫자 다음에 마침표가 붙습니다.

[a-z]+ 일련의 문자 TLD가 1 회 이상 일치하므로 TLD를 구입할 수 있으므로 더 이상 길이를 제한 할 수 없습니다 . http://tinyurl.com/cle6jqb

그런 다음 괄호로 묶어 역 참조로 마지막 두 섹션 모두를 캡처합니다.

우리는 다음 URL을 구축 :

<a href='http$1://$2'>http$1://$2</a> 

http$1://는 HTTP 역 참조 $1 도메인 이름을 포함 할 것 's'

$2 포함됩니다 HTTPS 경우 만듭니다. 우리는 URL이 링크 텍스트가되는 링크를 만듭니다.

+0

'$ 1333 $ 2'에서 두 개의 역 참조 사이의 숫자 333을 어떻게 피할 수 있습니까? – peter

1

이 비슷한을 사용할 수 있습니다 :

$string = preg_replace('/^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/ ', "<a href=\"$1\">Link</a>", $yourtext); 

일부 유용한 링크 :
이 도구를 사용하여 정규식을 시도해보십시오 click
정규식에서 : Nettuts
명명 된 역 참조 : Click