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

0

Я очищаю части веб-страницы, а затем вставляю результаты в mySQL.

Исходный код проблемной области:

<span class="profilelastlogin">
                    31,
                Kiev, Ukraine
                </span>

Я хочу выбрать 3 объекта, возраст, город, страну, а затем назначить их каждому индивидуальному варианту.

Я использую это регулярное выражение для выбора полной строки, но это не работает. Буду признателен за любые рекомендации.

$regexAgeCityCountry = '/<span class="profilelastlogin">(.*?)<\/span>/';
                preg_match_all($regexAgeCityCountry, $page, $outputAgeCityCountry);
  • 1
    Способ отказаться от содержимого html - это использовать html-анализатор (например, DOMDocument с DOMXPath), а не извлечение строк с помощью регулярных выражений или встроенных строковых функций.
Теги:

4 ответа

0
Лучший ответ

Почему не просто соответствуют 3 отдельным группам?

 /<span class="profilelastlogin">(.*?),(.*?),(.*?)<\/span>/s

Группа 1 содержит возраст, группа 2, город и группа 3 содержит страну.

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

/<span class="profilelastlogin">([0-9]*),(.*?),(.*?)<\/span>/s
  • 0
    Спасибо. Я полагаю, у вас есть тип / не \ в начале и в конце, но Yest прекрасно работает: Array ([0] => Array ([0] => 34, Симферополь, Российская Федерация) [1] => Array ([0] => 34) [2] => Массив ([0] => Симферополь) [3] => Массив ([0] => Российская Федерация))
  • 0
    Вы правы, опечатка;)
1

Вы можете использовать модификатор s (PCRE_DOTALL), чтобы обрабатывать ваш код как одну строку, поэтому '.' будет соответствовать символам новой строки.

Вот ссылка php:

Если этот модификатор установлен, метасимвол точки в шаблоне соответствует всем символам, включая символы новой строки. Без него новые строки исключаются. Этот модификатор эквивалентен модификатору Perl/s. Отрицательный класс, такой как [^ a], всегда соответствует символу новой строки, независимо от настройки этого модификатора.

Вот рабочий пример с исправлением

  • 0
    Отлично, спасибо. Как назначить каждую часть между каждой отдельной переменной?
0
<span class="profilelastlogin">\s+\K|\G(?!^)([^,]+),?\s*(?=[\s\S]*<\/span>)

Вы можете попробовать это, чтобы захватить 3 части. См. Демонстрацию.

https://www.regex101.com/r/rK5lU1/28

$re = "/<span class=\"profilelastlogin\">\\s+\\K|\\G(?!^)([^,]+),?\\s*(?=[\\s\\S]*<\\/span>)/mi";
$str = "<span class=\"profilelastlogin\">\n 31,\n Kiev, Ukraine\n </span>";

preg_match_all($re, $str, $matches);
0

сначала поместить все данные в 1 переменную, чем

$arr = explode(',',$yourvariable);

$city = $arr[0];

$state = $arr[1]; 

$country = $arr[2];

Ещё вопросы

Сообщество Overcoder
Наверх
Меню