2015-07-24 2 views
7

Пример:Поиск частичной строки в массиве PHP? Значение поиска содержит хэштегом

$array = array('alpha beta','beta gamma','delta phi', '#alpha phi', 'beta phi'); 
$searchword = 'alpha'; 
$results = array_filter($array, function($var) use ($searchword) { return preg_match("/\b$searchword\b/i", $var); }); 
print_r($results); 

Array ([0] => alpha beta [3] => #alpha phi) 

Я хотел бы найти только элементы, содержащие #alpha, не alpha.

В результате я хочу Array ([3] => #alpha phi).

Однако, это не работает:

$array = array('alpha beta','beta gamma','delta phi', '#alpha phi', 'beta phi'); 
$searchword = '#alpha'; 
$results = array_filter($array, function($var) use ($searchword) { return preg_match("/\b$searchword\b/i", $var); }); 
print_r($results); 

Array () 

Я также попытался $searchword = preg_quote('#alpha');, но это не работает. Я недостаточно знаком с регулярным выражением, чтобы понять это - должно быть какое-то правило регулярных выражений, которое я пропускаю?

Примечание: Я не ищу, чтобы найти все ключевые слова hashtag в массиве. Я хочу найти конкретное ключевое слово hashtag.

Кредит: Я использовал один из ответов от здесь: Search for PHP array element containing string

ответ

2

Удалить стартовую \b

preg_match("/$searchword\b/i", $var); 

или

Использование \B

preg_match("/\B$searchword\b/i", $var); 

Почему?

Это все о границах слов \b соответствует символу слова char и символу не-слова или наоборот. Поскольку первый символ равен #, который является символом, отличным от слова, и перед этим символом существует начало границы строки. \B подходит для этого, что соответствует двум символам без слов или двум символам слов. Здесь начало строки, #, поэтому должно существовать \B между ними не \b.

+0

$ вара массив - просто сказать – ArtisticPhoenix

+1

прекрасно работает и спасибо за разъяснение о регулярных выражениях правил, что действительно помогает! – Feanne

+0

@Feanne - вы понимаете, что это будет соответствовать '* alpha',' + alpha', '% alpha', а также' # alpha', хотя, как мне показалось, я бы упомянул об этом. Как ни странно, только мой ответ будет соответствовать '# alpha' точно и никакого другого стартового слова. – ArtisticPhoenix

1

Изменить код

$searchword = 'alpha'; 

To

$searchword = '^#alpha'; 

начинается с ^# хэштегом,

preg_match('/^#alpha/', '#alphasomething'); 

будет соответствовать #alpha

https://regex101.com/r/rU1eA9/1

Не соответствует alpha

https://regex101.com/r/rU1eA9/2

Видя, как это открыто для взаимопроникновения

Я хотел бы найти только элементы, содержащие #alpha

Некоторые ответы могут соответствовать различным вещам S, что «содержать» #alpha такие как b#alphagama или в некоторых случаях gamma #alpha и т.д.

я, хотя я хотел бы упомянуть ведущие ^ моркови в моем RegX означает начинается. Поэтому для того, чтобы мой ответ соответствовал строке, должен начинаться с хэштага #, за которым следует alpha буквально.

Таким образом, мой ответ может быть не лучшим, если вы просто хотите «содержит» #alpha, например gama#alpha. Но если вы хотите начать с #alpha, я бы порекомендовал его использовать.

Я чувствую, что важно убедиться, что я высоко осветил эти кромки, и именно то, что означает ведущий ^.

2

Отбросьте первый \bword boundary и использовать $searchword = '#alpha';
Для поиска массива и получить записи, соответствующие использование шаблона preg_grep function:

print_r(preg_grep("/".preg_quote($searchword, "/")."\b/i", $array)); 

Массив ( [3] => #alpha фита )

Test at eval.in

+0

Upvote для 'preg_grep'. Идеальное использование для этой функции. – Scopey

+0

снова отсутствие привязки '^' означает, что это также будет соответствовать 'beta # alpha', а также' b # alpha' и т. Д. – ArtisticPhoenix

+0

@ArtisiticPhoenix Вопрос был: ... Значение поиска ** содержит ** hashtag –

2

Или вы можете также использовать strpos вместо preg_match в

$searchword = '#alpha'; 
$results = array_filter($array, function($var) use ($searchword) { return (strpos($var,$searchword)>-1); }); 
+0

, это будет match 'beta # alpha', а также' b # alpha' и т. д. – ArtisticPhoenix

+0

Возможно, это так –

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