So ersetzen Sie http: // oder www durch eine href .. in PHP

8

Ich habe diesen Regex erstellt

%Vor%

das passt zu jedem Ссылка oder www .... aber ich weiß nicht, wie preg_replace funktionieren soll, ich habe es versucht

%Vor%

aber es funktioniert nicht, das Ergebnis ist eine leere Zeichenfolge.

    
Jakub Arnold 04.07.2009, 21:11
quelle

6 Antworten

14

Sie müssen die Schrägstriche in der Regex umgehen, da Sie Schrägstriche als Trennzeichen verwenden. Sie können auch ein anderes Symbol als Trennzeichen verwenden.

%Vor%     
Jeremy Ruten 04.07.2009, 21:15
quelle
2

Wenn Sie die von den anderen Benutzern bereitgestellten Regex-Codes verwenden, achten Sie darauf, das Flag "i" hinzuzufügen, um die Groß- / Kleinschreibung zu aktivieren, damit es sowohl mit HTTP: // als auch mit http: // funktioniert. Verwenden Sie zum Beispiel den Chaos-Code:

%Vor%     
zacharyliu 04.07.2009 21:26
quelle
2

Zuallererst müssen Sie die Delimeter, wie in den anderen Antworten erklärt, fliehen - oder besser noch ersetzen.

%Vor%

Zweitens, um die Regex weiter zu verbessern, wird die $n Ersatzreferenzsyntax gegenüber \n bevorzugt, wie in angegeben Handbuch .

%Vor%

Drittens verwenden Sie überflüssige Klammern, die die Dinge nur verlangsamen. Sie loswerden. Vergessen Sie nicht, auf (?: ) zu aktualisieren. Falls Sie sich wundern, sind dies nicht erfassende Klammern: [^ ]+ .

%Vor%

Schließlich würde ich \S durch die kürzere und genauere \s ersetzen, was das Gegenteil von [^ ]+ ist. Beachten Sie, dass \S keine Leerzeichen erlaubt, aber Zeilenumbrüche und Tabulatoren akzeptiert! %code% nicht.

%Vor%     
Geert 04.07.2009 21:33
quelle
1

Ihr Hauptproblem scheint zu sein, dass Sie alles in Klammern setzen, damit es nicht weiß, was "\ 1" ist. Außerdem müssen Sie dem "/" entkommen. Versuchen Sie es also:

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

Edit: Es scheint tatsächlich, die Klammern waren kein Problem, ich habe es falsch gelesen. Die Flucht war immer noch ein Thema, auf das auch andere hingewiesen haben. Jede Lösung sollte funktionieren.

    
Sasha 04.07.2009 21:15
quelle
1
%Vor%

Wenn Sie / als Mustertrennzeichen verwenden, funktioniert / in Ihrem Muster nicht gut. Ich habe das gelöst, indem ich ! als Mustertrennzeichen verwendet habe, aber Sie könnten stattdessen Ihre Schrägstriche mit Backslashes umgehen.

Ich habe auch keinen Grund gesehen, warum du zwei Paren-Captures gemacht hast, also habe ich einen von ihnen entfernt.

Ein Teil des Problems in Ihrer Situation besteht darin, dass Sie mit deaktivierten Warnungen arbeiten. Wenn du error_reporting(E_ALL) aktiviert hättest, hättest du die Nachrichten gesehen, die PHP in deinem Regex über dein Delimiterproblem zu generieren versucht.

    
chaos 04.07.2009 21:14
quelle
1

Wenn mehrere URLs in einem String enthalten sind, der durch einen Zeilenumbruch anstelle eines Leerzeichens getrennt ist, müssen Sie das \ S

verwenden %Vor%     
Thanh Trung 19.10.2012 15:57
quelle

Tags und Links