Mögliches Duplikat:
Regular Expression Sanitize (PHP)
Ich habe ein Problem mit URLs. Ich möchte in der Lage sein, Titel zu konvertieren, die alles enthalten können, und ihnen alle Sonderzeichen entziehen, sodass sie nur Buchstaben und Zahlen enthalten. Natürlich möchte ich Leerzeichen durch Bindestriche ersetzen.
Wie würde das gemacht werden? Ich habe viel über reguläre Ausdrücke (Regex) gehört, die verwendet werden ...
Kinderleicht:
function clean($string) {
$string = str_replace(' ', '-', $string); // Replaces all spaces with hyphens.
return preg_replace('/[^A-Za-z0-9\-]/', '', $string); // Removes special chars.
}
Verwendungszweck:
echo clean('a|"[email protected]£de^&$f g');
Gibt aus: abcdef-g
Bearbeiten:
Hey, nur eine kurze Frage, wie kann ich verhindern, dass mehrere Bindestriche nebeneinander stehen? und haben sie mit 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.
}
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);
}
Das Grundprinzip für die obigen Funktionen (die ich als ineffizient betrachte - die unten stehende ist besser) ist, dass ein Dienst, der nicht mit benannt werden soll, anscheinend ausgeführt wird Rechtschreibprüfung und Schlüsselworterkennung auf den URLs.
Nachdem ich lange Zeit die Paranoias eines Kunden verloren hatte, stellte ich fest, dass sie sich doch nichts einbildeten - ihre SEO-Experten [ich bin definitiv nicht einer] berichteten, dass sie beispielsweise "Viaggi konvertieren" Economy Perù "to viaggi-economy-peru
" benahm sich besser "als viaggi-economy-per
(die vorherige" Bereinigung "entfernte UTF8-Zeichen; Bogotà wurde bogot, Medellín wurde Medellín und so weiter).
Es gab auch einige häufige Rechtschreibfehler, die die Ergebnisse zu beeinflussen schienen, und die einzige Erklärung, die für mich Sinn machte, war, dass unsere URL entpackt, die Wörter herausgegriffen und verwendet wurden, um Gott weiß, welche Bewertungsalgorithmen verwendet wurden. Und diese Algorithmen wurden anscheinend mit UTF8-gereinigten Zeichenfolgen gespeist, sodass "Perù" zu "Peru" anstelle von "Per" wurde. "Per" passte nicht zusammen und nahm es irgendwie in den Nacken.
Um UTF8-Zeichen beizubehalten und einige Rechtschreibfehler zu ersetzen, wurde die schnellere Funktion unten zur genaueren (?) Funktion oben. $dict
muss natürlich von Hand zugeschnitten werden.
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, being special, is escaped with \
$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 möglicherweise zuerst die URL urldecode()
eingeben müssen, da% 20 und + tatsächlich Leerzeichen sind - ich meine, wenn Sie "Never% 20gonna% 20giving% 20you% 20up" haben, möchten Sie, dass sie Never-Gonna wird -give-you-up, nicht Never20gonna20give20you20up . Sie brauchen es vielleicht nicht, aber ich dachte, ich würde die Möglichkeit erwähnen.
Also die fertige Funktion zusammen mit 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 eine cleanString
-Implementierung verwendet, die online gefunden wurde Zeichen, falls erforderlich), die UTF8-Zeichen in normale Zeichen konvertieren, wodurch das Wort "look" so weit wie möglich erhalten bleibt. Es könnte vereinfacht und hier aus Performancegründen in die Funktion eingebunden werden.
Die obige Funktion implementiert auch die Konvertierung in Kleinbuchstaben - aber das ist ein Vorgeschmack. Der Code dazu wurde auskommentiert.
Überprüfen Sie hier diese Funktion:
function seo_friendly_url($string){
$string = str_replace(array('[\', \']'), '', $string);
$string = preg_replace('/\[.*\]/U', '', $string);
$string = preg_replace('/&(amp;)?#?[a-z0-9]+;/i', '-', $string);
$string = htmlentities($string, ENT_COMPAT, 'utf-8');
$string = preg_replace('/&([a-z])(acute|uml|circ|Grave|ring|cedil|slash|tilde|caron|lig|quot|rsquo);/i', '\\1', $string );
$string = preg_replace(array('/[^a-z0-9]/i', '/[-]+/') , '-', $string);
return strtolower(trim($string, '-'));
}