2010-01-04 7 views
0

Я использую strpos(), чтобы найти иглу в стоге сена. Но я хочу, чтобы он нашел только иглу с той же длиной строки. Например .:PHP: Использование strpos() для поиска только иглы

$mystring = '123/abc'; 
$findme = 'abc'; 
$pos = strpos($mystring, $findme); // THIS IS FINE 

$mystring = '123/abcdefghijk'; 
$findme = 'abc'; 
$pos = strpos($mystring, $findme); // THIS IS NOT FINE 

Итак, мне нужно, чтобы проверить длину строки найденной строки и совпадающее с иглой, чтобы увидеть, если они имеют одинаковую длину. Итак, 123/abc соответствует abc правильно, но я не хочу, чтобы 123/abcdefghijk соответствовал abc, потому что он длиннее 3 символов.

+3

Вы говорите, что хотите добиться успеха только в том случае, если ваша игла находится на * конце * строки? – TML

ответ

1

substr() может принимать аргумент negative3, который рассчитывается с конца строки. Так выяснить длину иглы, отсчитать количество символов от конца и сравнить его с иглой:

if (substr($mystring, -strlen($findme)) == $findme) { 
    ... 
} 
1

вопросом является довольно расплывчатым («123/а» явно больше, чем 3-х символов, а также !), но вы можете искать substr_compare() с отрицательным индексом.

0

Вы говорите, что косые черты значительны, т.е. вы хотите только совместить иглу, когда она одна в серии разделенных черным жетоном?

Если да, то вы можете либо попытаться регулярное выражение:

preg_match('/(^|\/)abc($|\/)/', $mystring, $matches, PREG_OFFSET_CAPTURE); 
$pos= FALSE; 
if (count($matches)>=1) 
    $pos= $matches[0][1]; 

или разделить на косой черты и работать с отдельными строковых частей:

$parts= explode('/', $mystring); 
$pos= array_search($parts, 'abc'); 
if ($pos!==FALSE) 
    $pos= count(implode('/', array_slice($parts, 0, $pos))); 

Regex, вероятно, немного быстрее. Но последний был бы лучшим шагом, если вам нужно сопоставить произвольные строки, разделенные словом, которые могут содержать специальные символы регулярных выражений.