Я очищаю части веб-страницы, а затем вставляю результаты в mySQL.
Исходный код проблемной области:
<span class="profilelastlogin">
31,
Kiev, Ukraine
</span>
Я хочу выбрать 3 объекта, возраст, город, страну, а затем назначить их каждому индивидуальному варианту.
Я использую это регулярное выражение для выбора полной строки, но это не работает. Буду признателен за любые рекомендации.
$regexAgeCityCountry = '/<span class="profilelastlogin">(.*?)<\/span>/';
preg_match_all($regexAgeCityCountry, $page, $outputAgeCityCountry);
Почему не просто соответствуют 3 отдельным группам?
/<span class="profilelastlogin">(.*?),(.*?),(.*?)<\/span>/s
Группа 1 содержит возраст, группа 2, город и группа 3 содержит страну.
Вы также можете использовать это регулярное выражение, чтобы убедиться, что возраст всегда будет числовым:
/<span class="profilelastlogin">([0-9]*),(.*?),(.*?)<\/span>/s
Вы можете использовать модификатор s (PCRE_DOTALL), чтобы обрабатывать ваш код как одну строку, поэтому '.' будет соответствовать символам новой строки.
Вот ссылка php:
Если этот модификатор установлен, метасимвол точки в шаблоне соответствует всем символам, включая символы новой строки. Без него новые строки исключаются. Этот модификатор эквивалентен модификатору Perl/s. Отрицательный класс, такой как [^ a], всегда соответствует символу новой строки, независимо от настройки этого модификатора.
Вот рабочий пример с исправлением
<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);
сначала поместить все данные в 1 переменную, чем
$arr = explode(',',$yourvariable);
$city = $arr[0];
$state = $arr[1];
$country = $arr[2];