2016-10-25 5 views
-7

habe ich Links wie dieseText in einer URL ersetzt Also im Grunde mit PHP

https://dog.example.com/randomgenerated45443444444444 
https://turtle.example.com/randomgenerated45443 
https://mice.example.com/randomgenerated452 
https://monkey.example.com/randomgenerated43232323 
https://leopard.example.com/randomgenerated22222222222222222 

ich mich gefragt, ob es möglich war, die Worte zwischen https:// und .example.com/ zu erkennen, die der zufälligen Tiername wären. Und ersetzen Sie es durch "thumbnail". Die Menge der Buchstaben in den Tiernamen und randomgenerated diejenigen variieren immer in Höhe der Buchstaben in ihnen

+2

ja.es ist möglich. aber: hast du überhaupt schon was probiert? –

+0

Es ist möglich. Sie müssen die TLD im Grunde von den anderen trennen. Ich empfehle [TLDExtract] (https://github.com/layershifter/TLDExtract). Es ist viel genauer, dass 'parse_url()' oder ein Ad-hoc-Regex. – Andrew

+0

Wenn eine Antwort Ihr Problem gelöst hat, ziehen Sie in Betracht, die Antwort zu akzeptieren. Hier ist, wie http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work dann hier zurückkehren und das gleiche mit dem Häkchen/Häkchen, bis es grün wird. Dies informiert die Community, eine Lösung wurde gefunden. Sonst denken andere vielleicht, dass die Frage noch offen ist und möchten vielleicht (mehr) Antworten posten. * Willkommen bei Stack! * –

Antwort

1

Sie können eine positive Vorschau verwenden, um die Daten zu erhalten, die Sie wünschen:

$string = 'https://leopard.example.com/randomgenerated22222222222222222'; 
$pattern = '/(?=.*\/\/)(.*?)(?=\.)/'; 
$replacement = 'thumbnail'; 
$foo = preg_replace($pattern, $replacement, $string); 

$protocol = 'https://'; 
echo $protocol . $foo; 

kehrt

https://thumbnail.example.com/randomgenerated22222222222222222

Erklärung der reg ex:

Positive Lookahead (?=.*\/\/)
behauptet, dass die Regex unten übereinstimmt
.* jedes Zeichen (mit Ausnahme der Linie Terminator)
* Quantifizierer - Spiele zwischen null und beliebig oft, so oft wie möglich , so dass je nach Bedarf zurück (gierig)
\/ entspricht dem Zeichen / wahrsten Sinne des Wortes (Groß- und Kleinschreibung)
\/ entspricht dem Zeichen / wörtlich (Fall sen sitive)
1.e Capturing Gruppe (*)
.*? jedes Zeichen (mit Ausnahme der Linie Terminator)
*? Quantifizierer.? - Spiele zwischen null und unbegrenzten Zeiten, so wenig wie möglich, je nach Bedarf erweitert (faul)
Positive Lookahead (?=\.)
behaupten, dass die Regex unten übereinstimmt
\. den Charakter passt. wörtlich (Groß-/Kleinschreibung beachten)

+1

Ich studiere PHP. Vielen Dank für den Rat – Darryl

-1

Unter der Annahme, dass https:// und example.com nie ändern, dann ist dies die einfachste regex Sie zum Zwecke verwenden:

https://(.+)\.example\.com

Alles in der (.+) wird die Wörter sein, die Sie versuchen zu extrahieren.


Bearbeiten auf 2016.10.27:

Während die / Zeichen in regulären Ausdrücken keine besondere Bedeutung hat, wird es wahrscheinlich entgangen werden müssen (\/), wenn Sie auch sind, sie als Ihr Ausdrucksbegrenzer. So die oben aussehen wird:

https:\/\/(.+)\.example\.com

+0

Sie sollten Ihre Regex testen, es funktioniert überhaupt nicht. Es schlägt fehl, weil Sie die Schrägstriche zu Beginn nicht ordnungsgemäß entkam. https://regex101.com/ ist ein guter Ort zum Testen. [Hier ist ein Beispiel mit Ihrer Regex] (https://regex101.com/r/9gzOGQ/1) –

+0

@JayBlanchard Wenn Sie gehen und schauen Sie sich die offizielle PHP-Dokumentation http://php.net/manual/en/function .preg-quote.php Sie werden lesen, dass '/' _nicht_ per Definition ein spezielles RegExp-Zeichen ist. Der Grund dafür, dass es möglicherweise entfernt werden muss, ist, wenn es als Trennzeichen in einem RegExp-Literal verwendet wird. Mein Beispiel war das reine RegExp-Muster, um das Lesen zu erleichtern. – tmslnz

Verwandte Themen