2011-06-27 20 views
5

Używam php's preg_replace() do konwersji dowolnych słów, które mają przed sobą symbol hashtag do hiperłączy.Jak przekonwertować tekst hashtagu na hiperłącze hashtag?

Więc coś takiego: #austin staną: <a href="/tag/austin">#austin</a>

Oto moje wyrażenie regularne.

preg_replace('/\B#(\w*[A-Za-z_]+\w*)/', '<a href="/tag/$1">$0</a>', $text);

Mój problem jest: czy są jakieś wielkich liter, wartość href je zachować, ale chcę wartość href, aby zawsze być w całości małymi literami.

Wejście: #Austin
nie powinny stać się: <a href="/tag/Austin">#Austin</a>
To powinno stać: <a href="/tag/austin">#Austin</a>

Jak mogę zmodyfikować moje wyrażenia regularnego do tworzenia tych wyników?

Odpowiedz

5

Oto przykład przy użyciu preg_replace_callback jak sugeruje @faileN:

Demo Link

$string = '#Austin'; 

function hashtag_to_link($matches) 
{ 
    return '<a href="/tag/' . strtolower($matches[1]) . '">' . $matches[0] . '</a>'; 
} 

echo preg_replace_callback('/\B#(\w*[a-z_]+\w*)/i', 'hashtag_to_link', $string); 

// output: <a href="/tag/austin">#Austin</a> 
3

Spróbuj tego:

preg_replace('/\B#(\w*[A-Za-z_]+\w*)/', '<a href="/tag/$1">$0</a>', strtolower($text)); 

To zmusi obiekt ($text), aby być pisane małymi literami przed regex jest testowany.

+0

Ale tekst łącza będzie również pisany małymi literami. –

+0

Wygląda na to, co chce OP. –

+0

Przepraszam, że nie sprecyzowałem, chcę, żeby rzeczywiste słowa obudowy pozostały takie same ... więC#Austin będzie "#Autsin' – floatleft

1

Teoretycznie można użyć e modyfikator, który pozwala na korzystanie z funkcji PHP w ciągu zastępowania:

preg_replace('/\B#(\w*[A-Za-z_]+\w*)/e', "'<a href=\"/tag/'.strtolower('$1').'\">$0</a>'", $text); 
+0

Ta metoda została [wycofana z PHP5.5 i usunięta z PHP7] (http: // php. net/manual/en/reference.pcre.pattern.modifiers.php) (ale logika jest dobra) – mickmackusa

Powiązane problemy