搜尋

首頁  >  問答  >  主體

比較兩個字串並忽略(但不替換)重音符號。 PHP

<p>我得到了(例如)兩個字串:</p> <pre class="brush:php;toolbar:false;">$a = "joao"; $b = "joão"; if ( strtoupper($a) == strtoupper($b)) { echo $b; }</pre> <p>我希望即使有重音,它也能為真。然而,我需要它忽略重音而不是替換,因為我需要輸出"joão"而不是"joao"。 </p> <p>我看到的所有答案都是將"ã"替換為"a",而不是使比較為真。我一直在閱讀有關規範化的內容,但我也無法使其工作。有什麼想法嗎?謝謝。 </p>
P粉476046165P粉476046165457 天前480

全部回覆(2)我來回復

  • P粉068510991

    P粉0685109912023-08-18 11:34:44

    我想分享一個優雅的解決方案,避免使用htmlentities,並且不需要手動列出所有字元替換。這是對這個帖子的php翻譯。

    function removeAccents($str) {
        return preg_replace('/[\x{0300}-\x{036f}]/u',"",normalizer_normalize($str,Normalizer::FORM_D));
    }
    
    $a = "joaoaaeeA";
    $b = "joãoâàéèÀ";
    
    var_dump(removeAccents($a) === removeAccents($b));

    輸出:

    bool(true)

    回覆
    0
  • P粉470645222

    P粉4706452222023-08-18 10:51:27

    只需將重音符號轉換為它們的非重音對應部分,然後比較字串。我答案中的函數將為您刪除重音符號。

    function removeAccents($string) {
        return strtolower(trim(preg_replace('~[^0-9a-z]+~i', '-', preg_replace('~&([a-z]{1,2})(acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i', '', htmlentities($string, ENT_QUOTES, 'UTF-8'))), ' '));
    }
    
    $a = "joaoaaeeA";
    $b = "joãoâàéèÀ";
    
    var_dump(removeAccents($a) === removeAccents($b));

    輸出:

    bool(true)

    示範

    回覆
    0
  • 取消回覆