Оптимизация preg_match() в PHP

#php #arrays #if-statement #optimization #preg-match

#php #массивы #if-оператор #оптимизация #preg-match

Вопрос:

Я использую следующую функцию в PHP для определения объекта и местоположения по строкам, которые содержат в нем «near», используя preg_match(); . Есть ли более оптимальный способ написать код для этого? Я использую много операторов if, и кажется, что это можно улучшить, но я не уверен, как.

 // Test cases
$q = "red robin near seattle";
//$q = "red robin near me";
//$q = "red robin nearby";
//$q = "red robin near my location";

function getEntityAndLocation($q){

    $entityAndLocation = array("entity" => null, "location" => null);

    if(preg_match('(nearby)', $q) === 1) {
        $breakdown = explode("nearby", $q);
        $entityAndLocation["entity"] = $breakdown[0];
        $entityAndLocation["location"] = $breakdown[1];
        return $entityAndLocation;
    }

    if(preg_match('(near my location)', $q) === 1) {
        $breakdown = explode("near my location", $q);
        $entityAndLocation["entity"] = $breakdown[0];
        $entityAndLocation["location"] = $breakdown[1];
        return $entityAndLocation;
    }

    if(preg_match('(near me)', $q) === 1) {
        $breakdown = explode("near me", $q);
        $entityAndLocation["entity"] = $breakdown[0];
        $entityAndLocation["location"] = $breakdown[1];
        return $entityAndLocation;
    }

    if(preg_match('(near)', $q) === 1) {
        $breakdown = explode("near", $q);
        $entityAndLocation["entity"] = $breakdown[0];
        $entityAndLocation["location"] = $breakdown[1];
        return $entityAndLocation;
    }

}

if(preg_match('(near)', $q) === 1) {

  $entityAndLocation = getEntityAndLocation($q);

  print_r($entityAndLocation);

}
  

Комментарии:

1. итак, вы хотите посмотреть, содержит ли строка определенную «фразу / слово»?

Ответ №1:

используется preg_split() для использования регулярного выражения в качестве разделителя для разделения строки. Вы можете написать единственное регулярное выражение, которое соответствует всем вашим шаблонам.

 function getEntityAndLocation($q){

    $entityAndLocation = array("entity" => null, "location" => null);

    $breakdown = preg_split('/near(?:by| my location| me)?/', $q);
    if (count($breakdown) >= 2) {
        $entityAndLocation["entity"] = $breakdown[0];
        $entityAndLocation["location"] = $breakdown[1];
        return $entityAndLocation;
    }
    return $entityAndLocation;
}
  

Соответствует регулярное выражение near , за которым необязательно следует by , my location или me .

Комментарии:

1. Хм, у меня возникли проблемы с его реализацией. Вы имели в виду поместить $entityAndLocation = array(«entity» => null, «location» => null); перед $breakdown? Кроме того, означает ли $ 1 значение $ q?

2. Да, это просто заменяет все if инструкции, ничего больше.

3. Я использую вашу функцию с «red robin near seattle» и получаю пустой массив в качестве вывода. В частности, Array ( [entity] => [location] => )

4. Извините, опечатка, :? должно было быть ?:

5. Странно, я изменил:? кому?: но я все еще получаю пустой массив $entityAndLocation