it-swarm.com.de

Entfernen Sie alle Sonderzeichen aus einer Zeichenfolge

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 ...

191
user115422

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.
}
603
Terry Harvey

Aktualisieren

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.

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, 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.

98
LSerni

Ü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, '-'));
}
35
Jeffrey