В следующей строке мне нужно извлечь только 2014-04-19, используя php и regex с preg_match
...</abbr></td><td><abbr class="dtend" title="2014-04-19T00:00:00+00:00">19 Apr 2014</abbr></td></tr>...
Строка preg_match и regex, которую я использую:
preg_match("/class=\"dtend\" title=\"(.*)\"\>/i", $str,$str2);
Строка, которую я получаю:
2014-04-19T00:00:00+00:00
После "T" числа (время), очевидно, являются случайными. Я не очень опытный, ни новичок, но на самом деле не могу решить проблему. Можете ли вы дать предложение/какую-то помощь?
Ваше регулярное выражение является неполным. Измените его так:
"/class=\"dtend\" title=\"(.*)T.*\"\>/i"
Таким образом, группа захвата захватывает только до первого T
Можете использовать lookahead для удовлетворения T
, есть много способов сделать это:
$pattern = '/class="dtend" title="\K[^"]+(?=T)/i';
$out[0]
.[^"]+
, как charcters быть согласованы (+
один или несколько символов, которые не являются "
)Дополнительные сведения о регулярном выражении см. В разделе " Вопросы и ответы".
\K
Зачем использовать выражение regelar в известной строке?
вы должны сделать что-то вроде этого -
$var = '<td>T<abbr class="dtend" title="2014-04-19T00:00:00+00:00">19 Apr 2014</abbr></td></tr>';
$string_to_search = 'class="dtend" title="';
$start = strpos($var, $string_to_search);
$var = substr($var,$start+strlen($string_to_search),10);
Это может выглядеть хуже, поскольку регулярное выражение делает это более простым способом, но пока вы знаете, что вы ожидаете, вы всегда должны использовать простые строковые функции вместо регулярного выражения.
вы можете использовать:
preg_match("/class=\"dtend\" title=\"([0-9\\-]+)[^\"]+\"\>/i", $str,$str2);
([0-9\\-]+)
выберет любые числовые символы или -
(ПРИМЕЧАНИЕ: из-за множественного экранирования вам может понадобиться использовать tree/four \
здесь)
[^\"]+
- пропустить все не "
символы