php
  • regex
  • 2010-11-28 4 views 4 likes 
    4

    Я пытаюсь получить матч из этой строкиRegular Expression, чтобы соответствовать коснуться, который начинается с

    "Dial [Toll Free 1800 102 8880 ext: 246] to connect to the restaurant. <a class='tooltip' title='Foodiebay has now introduced value added calling features through the website. You just need to dial this number and we ..." 
    

    Где я хочу, чтобы проверить, является ли переменная начинается со строки набора

    $a = 'Dial [Toll Free 1800 102 8880 ext: 246] to connect to the restaurant. <a class='tooltip' title='Foodiebay has now introduced value added calling features through the website. You just need to dial this number and we'; 
    
    preg_match('/[^Dial]/', $a, $matches); 
    

    ответ

    8

    Потеря квадратных скобок:

    /^Dial/
    

    Это соответствует e string "Dial " в начале строки.

    FYI: Ваше исходное регулярное выражение представляет собой инвертированный класс символов [^...], который соответствует любому символу, который не находится в классе. В этом случае он будет соответствовать любому символу, который не является «D», «i», «a» или «l». Поскольку почти каждая строка будет иметь хотя бы характер, который не является одним из них, почти каждая строка будет соответствовать.

    5

    Я предпочел бы использовать StrPos вместо регулярного выражения:

    if (strpos($a, 'Dial') === 0) { 
        // ... 
    

    === важно, потому что это может также возвращает ложь. (false == 0) это правда, но (false === 0) является ложным.

    Редактировать: После тестов (миллион итераций) с строкой OP strpos примерно на 30% быстрее, чем substr, что примерно на 50% быстрее, чем preg_match.

    +2

    Не будет substr ($ a, 0,4) == 'Dial' будет быстрее, если он не существует в строке (и строка очень длинная)? – 2010-11-28 03:57:17

    Смежные вопросы