2014-02-28 3 views
0

트위터 게시물을 연결하려고합니다. 그러나 "# löövet"처럼 보이는 해시 태그는 필자가 원하는대로 필터를 얻지 못합니다. 외계인 앞에서 끊어집니다. 외국 문자는 허용되어야합니다.preg_replace가 특수 문자로 바꾸는 것을 방지하십시오.

누구나이 목적을 위해 정규식을 변경하는 방법을 알고 있습니까? 당신의 해시 태그가 없습니다 어떤 공간을 포함 할 경우

//Hashtag 
$tweet = preg_replace("/ +#([a-z0-9_]*)?/i", " <a href=\"http://twitter.com/tag/\\1\" target=\"_blank\">#\\1</a>", $tweet); 



//Problem: 
/* 
* The function above does not match foreign characters as å/ä/ö 
* Tag result example: tag = #löövet 
* After preg_replace: tag = #l öövet 
* Desired after preg_replace: tag = #löövet 
*/ 
+0

당신이 UTF-8 인코딩을 사용하는 경우가 ** 유 ** 패턴에 플래그가 작동하지 않을 수 있습니다 추가. 물론, 당신이 명시 적으로 악센트가없는 라틴 알파벳 (a-z 및 A-Z)을 나열 했으므로,이 경우에 모두 얻을 수있는 것입니다. 유니 코드 사용 가능 코드 사용에 대한 다른 해답을보십시오. –

답변

2

:

$tweet = preg_replace("/ +#(\p{Xwd}*)/u", " <a href=\"http://twitter.com/tag/$1\" target=\"_blank\">#$1</a>", $tweet); 

\p{Xwd}이 같은 의미을이있다 모든 유니 코드 문자와 숫자 및 밑줄이있는.

밑줄을 원하지 않으면 \p{Xan}을 사용하십시오. 당신은 라틴어 문자로 허용 된 문자를 제한하려면

+0

당신은 오타''/ + # (\ p {Xwd} *)/u " '. 대괄호 대신 중괄호. 이것은 작동하는 것 같다! –

+0

@ AlbinN : 당신 말이 맞습니다. – Toto

0

대신 유니 코드 뒤에 실행, 당신이 하나를 시도 할 수 있습니다 :

다음은 내 예입니다. 대신 AZ의

/ +#(\S+)/ 
1

사용 \ P는 {L}는 정규 표현식에서 유니 코드에 대한 자세한 내용을 찾기 위해 유니 코드 문자 (또는 번호 \ P는 {L} \ P는 {N})

$tweet = preg_replace("/ +#([\p{L}\p{N}_]*)?/i", " <a href=\"http://twitter.com/tag/\\1\" target=\"_blank\">#\\1</a>", $tweet); 

에 맞게 볼 here에 대해 어떻게

+0

그러면'# l v'가 반환되고 첫 번째 ' '전에 링크가 끊어집니다. 내 프로젝트에서 UTF-8을 사용하고 있습니다. –

0

, 당신은 사용할 수 있습니다

$tweet = preg_replace('/ +#([\p{Latin}0-9_]*)/u', ' <a href="http://twitter.com/tag/$1" target="_blank">#$1</a>", $tweet); 
관련 문제