Ersetzen Sie alle Zeichen, die keine Buchstaben und Zahlen sind, durch einen Bindestrich [duplicate]
Lesezeit: 7 Minuten
Benutzer115422
Ich stehe vor einem Problem mit URLs. Ich möchte in der Lage sein, Titel, die alles enthalten könnten, umzuwandeln und alle Sonderzeichen zu entfernen, sodass sie nur noch Buchstaben und Zahlen enthalten, und natürlich möchte ich Leerzeichen durch Bindestriche ersetzen.
Wie würde das geschehen? Ich habe viel über die Verwendung regulärer Ausdrücke (Regex) gehört …
Terry Harvey
Dies sollte das tun, wonach Sie suchen:
function clean($string) {
$string = str_replace(' ', '-', $string); // Replaces all spaces with hyphens.
return preg_replace('/[^A-Za-z0-9\-]/', '', $string); // Removes special chars.
}
Verwendung:
echo clean('a|"bc!@£de^&$f g');
Gibt aus: abcdef-g
Bearbeiten:
Hey, nur eine kurze Frage: Wie kann ich verhindern, dass mehrere Bindestriche nebeneinander stehen? und wurden sie durch nur 1 ersetzt?
function clean($string) {
$string = str_replace(' ', '-', $string); // Replaces all spaces with hyphens.
$string = preg_replace('/[^A-Za-z0-9\-]/', '', $string); // Removes special chars.
return preg_replace('/-+/', '-', $string); // Replaces multiple hyphens with single one.
}
@all Bitte beachten Sie, dass dies mit UTF-8 nicht funktioniert
– Yang
1. Januar 2013 um 22:11
@metal_fan was würde das bedeuten… ich meine, wie schlimm kann es sein?
– Benutzer115422
1. Januar 2013 um 22:15 Uhr
Die erste Zeile sollte als ersten Parameter ein Leerzeichen enthalten. Im Moment ist es nur eine leere Zeichenfolge. Hier korrigiert: $string = str_replace(‘ ‘, ‘-‘, $string);
– Russell Strauss
24. Juli 2013 um 17:34
@TerryHarvey, das würde nicht funktionieren, wenn „ das letzte Zeichen ist, z. B. „Amerika“ das Schlüsselwort ist, das Sie erhalten, und Sie es bereinigen müssen.
– einmalig benötigt
22. Okt. 2013 um 15:08
Gibt es einen guten Grund, warum die Clean-Funktion vor preg_replace einen str_replace ausführt, da sich reg_replace auch um das Leerzeichen kümmert?
– Hartgekochtes Wunderland
20. Okt. 2014 um 19:56
LSerni
verbesserte Reinigung
Die folgende Lösung hat eine „SEO-freundlichere“ Version:
function hyphenize($string) {
$dict = array(
"I'm" => "I am",
"thier" => "their",
// Add your own replacements here
);
return strtolower(
preg_replace(
array( '#[\\s-]+#', '#[^A-Za-z0-9. -]+#' ),
array( '-', '' ),
// the full cleanString() can be downloaded from http://www.unexpectedit.com/php/php-clean-string-of-utf8-chars-convert-to-similar-ascii-char
cleanString(
str_replace( // preg_replace can be used to support more complicated replacements
array_keys($dict),
array_values($dict),
urldecode($string)
)
)
)
);
}
function cleanString($text) {
$utf8 = array(
'/[áàâãªä]/u' => 'a',
'/[ÁÀÂÃÄ]/u' => 'A',
'/[ÍÌÎÏ]/u' => 'I',
'/[íìîï]/u' => 'i',
'/[éèêë]/u' => 'e',
'/[ÉÈÊË]/u' => 'E',
'/[óòôõºö]/u' => 'o',
'/[ÓÒÔÕÖ]/u' => 'O',
'/[úùûü]/u' => 'u',
'/[ÚÙÛÜ]/u' => 'U',
'/ç/' => 'c',
'/Ç/' => 'C',
'/ñ/' => 'n',
'/Ñ/' => 'N',
'/–/' => '-', // UTF-8 hyphen to "normal" hyphen
'/[’‘‹›‚]/u' => ' ', // Literally a single quote
'/[“”«»„]/u' => ' ', // Double quote
'/ /' => ' ', // nonbreaking space (equiv. to 0x160)
);
return preg_replace(array_keys($utf8), array_values($utf8), $text);
}
Die Begründung für die oben genannten Funktionen (die ich finde Weg ineffizient – das unten stehende ist besser) ist das ein Dienst, der nicht genannt werden darf hat offenbar Rechtschreibprüfungen und Schlüsselworterkennung für die URLs durchgeführt.
Nachdem ich eine lange Zeit mit der Paranoia eines Kunden verbracht hatte, fand ich heraus, dass dies der Fall war nicht Sie stellen sich doch Dinge vor – ihre SEO-Experten [I am definitely not one] berichtet, dass beispielsweise die Umstellung auf „Viaggi Economy Perù“ erfolgt viaggi-economy-peru „benahm sich besser“ als viaggi-economy-per (Bei der vorherigen „Bereinigung“ wurden UTF8-Zeichen entfernt; Bogota wurde bogot, Medellín wurde Medellín usw).
Es gab auch einige häufige Rechtschreibfehler, die die Ergebnisse zu beeinflussen schienen, und die einzige Erklärung, die für mich Sinn ergab, war, dass unsere URL entpackt, die Wörter herausgegriffen und zur Steuerung von Gott weiß was für Ranking-Algorithmen verwendet wurde. Und diese Algorithmen waren offenbar mit UTF8-bereinigten Strings gefüttert worden, sodass aus „Perù“ „Peru“ statt „Per“ wurde. „Per“ passte nicht zusammen und erwischte es irgendwie am Hals.
Um sowohl UTF8-Zeichen beizubehalten als auch einige Rechtschreibfehler zu ersetzen, wurde die schnellere Funktion unten zur genaueren (?) Funktion oben. $dict muss natürlich von Hand zugeschnitten werden.
Vorherige Antwort
Ein einfacher Ansatz:
// Remove all characters except A-Z, a-z, 0-9, dots, hyphens and spaces
// Note that the hyphen must go last not to be confused with a range (A-Z)
// and the dot, NOT being special (I know. My life was a lie), is NOT escaped
$str = preg_replace('/[^A-Za-z0-9. -]/', '', $str);
// Replace sequences of spaces with hyphen
$str = preg_replace('/ */', '-', $str);
// The above means "a space, followed by a space repeated zero or more times"
// (should be equivalent to / +/)
// You may also want to try this alternative:
$str = preg_replace('/\\s+/', '-', $str);
// where \s+ means "zero or more whitespaces" (a space is not necessarily the
// same as a whitespace) just to be sure and include everything
Beachten Sie, dass Sie dies möglicherweise zuerst tun müssen urldecode() die URL, da %20 und + beide eigentlich Leerzeichen sind – ich meine, wenn Sie „Never%20gonna%20give%20you%20up“ haben, möchten Sie, dass daraus Never-gonna-give-you-up wird, nicht Ich werde dich niemals aufgeben . Sie brauchen es vielleicht nicht, aber ich dachte, ich würde die Möglichkeit erwähnen.
Also die fertige Funktion samt Testfällen:
function hyphenize($string) {
return
## strtolower(
preg_replace(
array('#[\\s-]+#', '#[^A-Za-z0-9. -]+#'),
array('-', ''),
## cleanString(
urldecode($string)
## )
)
## )
;
}
print implode("\n", array_map(
function($s) {
return $s . ' becomes ' . hyphenize($s);
},
array(
'Never%20gonna%20give%20you%20up',
"I'm not the man I was",
"'Légeresse', dit sa majesté",
)));
Never%20gonna%20give%20you%20up becomes never-gonna-give-you-up
I'm not the man I was becomes im-not-the-man-I-was
'Légeresse', dit sa majesté becomes legeresse-dit-sa-majeste
Um mit UTF-8 umzugehen, habe ich a verwendet cleanString Online gefundene Implementierung (Link inzwischen defekt, aber eine abgespeckte Kopie mit allen nicht allzu esoterischen UTF8-Zeichen befindet sich am Anfang der Antwort; es ist bei Bedarf auch einfach, weitere Zeichen hinzuzufügen), die UTF8-Zeichen in normale umwandelt Zeichen, wodurch das Wort „Look“ so weit wie möglich erhalten bleibt. Aus Gründen der Leistung könnte es hier vereinfacht und in die Funktion eingebunden werden.
Die obige Funktion implementiert auch die Konvertierung in Kleinbuchstaben – aber das ist nur ein Vorgeschmack. Der Code dafür wurde auskommentiert.
Tolle Lösung, danke. Eine Anpassung jedoch: Tauschen Sie das 2. Array in hypenize preg_replace aus, um zu vermeiden, dass Wort1 und Wort 2 zu Wort1–Wort2, Array( ”, ‘-‘),
– Lösung
7. August 2022 um 20:01 Uhr
strtr() ist besser geeignet, Ihren Assoziativ zu konsumieren $dict Array. array_values() ist beim Füttern nicht notwendig $dict Zu str_replace(). Warum ist in der negierten Zeichenklasse ein Leerzeichen aufgeführt, wenn die Existenz eines Leerzeichens durch das zuvor ausgeführte Muster mit unmöglich gemacht wird? \s? ('#[^A-Za-z0-9. -]+#') Warum nicht ein kleineres Muster genießen, indem Sie den Mustermodifikator verwenden, bei dem die Groß-/Kleinschreibung nicht berücksichtigt wird? i?
Ein wörtlicher Bindestrich hat keinen Vorteil, wenn er in eckige Klammern gesetzt wird. -+ bedeutet das Gleiche wie Ihr [-]+. Dieser Antwort fehlt die pädagogische Erklärung. Warum führen Sie jeden dieser Schritte aus? Wie funktioniert es? Warum sollten andere Entwickler dies in ihr Projekt kopieren? Wenn Sie die resultierende Zeichenfolge bedingungslos in Kleinbuchstaben umwandeln möchten, warum vereinfachen Sie dann nicht alle früheren Prozesse durch Aufrufen? strtolower() wann wird die Zeichenfolge zum ersten Mal empfangen? Das Rücken an Rücken preg_replace() Aufrufe können konsolidiert werden, da die Funktion Arrays von Suchen und Ersetzen annehmen kann.
– mickmackusa
15. August 2022 um 5:26
14545000cookie-checkErsetzen Sie alle Zeichen, die keine Buchstaben und Zahlen sind, durch einen Bindestrich [duplicate]yes