У меня есть строка, и я хочу извлечь из нее данные.
$str = "Online (UVD) - 154,842 - Last Updated: Nov 23 2015 02:24 PM";
Мне нужен этот экстракт 154,842 и этот 2015. Я успешно извлек первую часть. с этим методом
trim(str_replace("Online (UVD) - ", "", str_replace(",", "", substr_replace($str, "", strpos($str, " - Last Updated"))), $str))
Теперь я не знаю, как извлечь другой. Данные могут отличаться, например,
$str = "Online (UVD) - 1123123 - Last Updated: Nov 23 2015 02:24 PM";
$str = "Online (UVD) - 12 - Last Updated: Nov 23 2015 02:24 PM";
$str = "Online (UVD) - 1546546 - Last Updated: Nov 23 2015 02:24 PM";
$str = "Online (UVD) - 3525252525 - Last Updated: Nov 23 2015 02:24 PM";
Есть ли лучший способ извлечения? /






Если строки всегда будут иметь одинаковое количество значений, возможно, explode, а затем использование определенных позиций массива подойдет вам.
$str = "Online (UVD) - 154,842 - Last Updated: Nov 23 2015 02:24 PM";
$pieces = explode(' ',$str);
echo 'Value is ' . $pieces[3] . ' and the year is ' . $pieces[9];
Именно тот код, который я собирался порекомендовать. По возможности избегайте регулярных выражений.
Спасибо. Я знаю, что взорваться, но это не приходило мне в голову: D
Если перед желаемым значением ввести дополнительный пробел, это не сработает. Мы должны поддерживать regex вместо explode, replaces, etc imho
Вы можете сделать это без использования регулярное выражение, если все слова в строке находятся в том же порядке, который вы указали. Попробуем с взорваться() -
<?php
$str = "Online (UVD) - 1123123 - Last Updated: Nov 23 2015 02:24 PM";
$str = "Online (UVD) - 12 - Last Updated: Nov 23 2015 02:24 PM";
$str = "Online (UVD) - 1546546 - Last Updated: Nov 23 2015 02:24 PM";
$str = "Online (UVD) - 3525252525 - Last Updated: Nov 23 2015 02:24 PM";
$digit = explode(' ',$str);
echo trim($digit[3]); // returns digits
echo trim($digit[9]); // returns date
?>
Спасибо друг. Я очень ценю это.
Я знаю, что на это дан ответ, но я думаю также предоставить решение regex для этого:
Чтобы извлечь 1-я группа, вы можете использовать следующее регулярное выражение:
preg_match('/.-.(\d+).-/', $str, $numExtracted);
if (!empty($numExtracted)) {
echo $numExtracted[1].PHP_EOL;
}
Чтобы извлечь ваш Год:
preg_match('/(\w\w\w).(\d\d).(\d\d\d\d)/', $str, $year, PREG_OFFSET_CAPTURE);
$year = $year[3][0];
echo $year.PHP_EOL;
Это сработало во всех следующих испытаниях:
Online (UVD) - 1123123 - Last Updated: Nov 23 2015 02:24 PM
Online (UVD) - 12 - Last Updated: Nov 23 2015 02:24 PM
Online (UVD) oi oi - 1546546 - Last Updated: Nov 23 2015 02:24 PM
Online -sdtgstg346fg - (UVD) - 3525252525 - Last Updated: Nov 23 2015 02:24 PM
Можете проверить рабочий код здесь
Согласно вашему комментарию, вы можете улучшить свое регулярное выражение, чтобы рассмотреть такие случаи:
.-.(\d+)?[\,\#\!\?\$\£\;\:]*(\d+)?.-
Он будет соответствовать всем вышеперечисленным плюс этим случаям:
Online (UVD) - 1123,123 - Last Updated: Nov 23 2015 02:24 PM
Online (UVD) - 1123#!,123 - Last Updated: Nov 23 2015 02:24 PM
Но я думаю, что есть время, когда вам нужно подумать, хотите ли вы сохранить полученную информацию или просто считать ее коррумпированной.
Вы даже можете ввести циклы для синтаксического анализа для каждого отдельного сценария, но если я ожидаю число, и вдруг regex, который запускает совпадение, относится к чему-то вроде 1A2B3C4G5D8D2F, я отброшу его, поскольку он идет далеко от того, что я изначально ожидал. Но все зависит от того, откуда вы получаете свою информацию, насколько вероятно, что она изменится и т. д. :)
Тем не менее, я думаю, что regex сделает вас счастливее и откроет гораздо больше возможностей.
PS: Для введенных особых случаев, поскольку число прерывается специальными символами (или даже словами, если вы их рассматриваете), оно теперь интерпретирует и 2 числа.
Привет, что насчет этого Online (UVD) - 1123,123 - Last Updated: Nov 23 2015 02:24 PM
Это не анализируется.
И что бы вам было интересно прихватить по этому поводу? 1-й или второй? Я думаю, вы можете подумать о том, когда вы можете удерживать полученную информацию, когда эта информация просто повреждена, и вы не можете просто ей доверять
@AliRasheed обновил мой ответ, чтобы ответить на ваш второстепенный вопрос :) Дайте мне знать, если это имеет смысл!
Это имеет смысл
проверь этот regex101.com/r/NOi7wZ/1