2010-03-27 2 views
5

оказался наиболее эффективным. Может быть сделано с substr, но это создает временную подстроку. Также может быть сделано с регулярным выражением, но медленнее, чем strpos, и не всегда дает правильный ответ, если слово содержит метасимволы (см. Комментарий Ayman Hourieh).соответствует слову до конца строки с strpos

Выбранный ответ:

if(strlen($str) - strlen($key) == strrpos($str,$key)) 
    print "$str ends in $key"; // prints Oh, hi O ends in O 

и лучше, чтобы проверить на строгое равенство === (см Дэвид ответ)

Спасибо всем за помощь.


Я пытаюсь совместить слово в строке, чтобы увидеть, происходит ли это в конце этой строки. Обычный strpos($theString, $theWord); не сделал бы этого.

В принципе, если $theWord = "my word";

$theString = "hello myword";  //match 
$theString = "myword hello";  //not match 
$theString = "hey myword hello"; //not match 

Что бы наиболее эффективный способ сделать это?

P.S. В названии я сказал strpos, но если лучший способ существует, все в порядке.

+0

Что вы подразумеваете под словом? Текст, ограниченный пространством? Будет ли ключевой «foo» соответствовать «barfoo» или только «bar foo»? –

+0

@Nick, если '$ word =" foo ";' тогда оба '$ предложения =" barfoo "или" bar foo ";' все равно 'match'. Это не важно в этом случае, если у него есть место перед этим или нет. – clover

+0

Возможный дубликат [Что самое эффективное испытание того, заканчивается ли строка PHP другой строкой?] (Http://stackoverflow.com/questions/619610/whats-the-most-efficient-test-of-whether-a- php-string-ends-with-another-string) – Gajus

ответ

5

Вы можете использовать strrpos функции для этого:

$str = "Oh, hi O"; 
$key = "O"; 

if(strlen($str) - strlen($key) == strrpos($str,$key)) 
    print "$str ends in $key"; // prints Oh, hi O ends in O 

или раствор на основе регулярных выражений, как:

if(preg_match("#$key$#",$str)) { 
print "$str ends in $key"; // prints Oh, hi O ends in O 
} 
+0

Регулярное решение не всегда дает правильные результаты. Смотрите мой комментарий на ответ @ jjclarkson. –

+0

@Ayman, спасибо за указание. Обновит сводку потока. – clover

+0

@Aryam: OP хочет совместить слово не только с любой строкой. Теперь я предположил, что слово будет буквенным или буквенно-цифровым. Если слово может содержать любой символ, из которого некоторые могут быть regex meta char, это не сработает, и нам нужно будет избежать метаданных. – codaddict

0

Вы можете использовать regular expression.

if(preg_match('/'.$theWord.'$/', $theString)) { 
    //matches at the end of the string 
} 

Или вы можете использовать strrpos() и добавить длину слова. (strrpos - "Найти позицию последнего вхождения символа в строке") Затем посмотрите, является ли это положением последнего символа в строке.

+2

Не создает правильный вывод, если '$ theWord' содержит метасимволы. Попробуйте с помощью '$ theWord' установить' '. '' Например. –

+0

Совершенно верно, вам обязательно нужно будет проверить слово и/или избежать метасимволов. – jjclarkson

+0

Это, вероятно, медленнее, чем первый метод codaddict. –

1

StrPos может быть наиболее эффективным в некоторых случаях, но вы также можете зиЬзЬг с отрицательным значением в качестве второго параметра для обратного отсчета от конца строки:

$theWord = "my word"; 
$theWordLen = strlen($theWord); 

$theString = "hello myword"; 
$matches = ($theWord ==substr($theString, -1 * $theWordLen); 
+1

Недостатком этого метода является то, что вы создаете временную строку из результата «substr». Метод strrpos, упомянутый codaddict, вероятно, быстрее (хотя вы хотели бы проверить строгое равенство). – David

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