Разбор HTTP POST в PHP с использованием REGEX?

0

Прежде чем я попрошу об этом, я просто хочу сказать, что у меня нет прежнего опыта регулярного выражения, но у меня есть идея, что они делают/могут выполнить.

У меня есть HTTP POST, входящий в мой скрипт, который будет выглядеть примерно так:

tagId = "123(COMMENT),456(COMMENT),6782(COMMENT)" 

где числа всегда будут tag_ids а (COMMENT) будут просто комментариями для людей, то есть не требуемыми скриптом.

Мне нужно только числовые значения, поэтому мой первоначальный план состоял в том, чтобы взорвать переменную в запятых, а затем пропустить каждый из элементов в этом массиве и просто найти подстроку до первой "(" Но это кажется очень неуклюжим способом " делать вещи.

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

Любые советы или просто указатели на полезные документы были бы замечательными, потому что, как я уже сказал, я их когда-то не использовал.

Теги:

5 ответов

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

Здесь работает регулярное выражение:

\(.*?\)(*SKIP)(?!)|\d+

демонстрация

Он будет соответствовать всем номерам за пределами круглых скобок. Предполагается, что вы не можете вставить скобки.

Он работает, сопоставляя скобки и их содержимое, и отбрасывая их, или число (которое затем будет снаружи).

  • 0
    Глядя на демо, это именно то, что я ищу. Мне придется немного поиграть с ним в php, но это то, чего я пытаюсь достичь. Спасибо!
  • 0
    @Lucas Trzesniewski (*SKIP) это было что-то новое для меня. так что же это на самом деле?
Показать ещё 1 комментарий
1

Вы можете превратить его в строку JSON

$tagID = '123(COMMENT123),456(COMMENT456),6782(COMMENT6782)';
preg_match_all('/(\d+)\((.+?)\)/i', $tagID, $matches);
$result = "";
for ($i = 0; $i < count($matches[1]); $i++) {
    $toAdd = '{"tagID":' . $matches[1][$i] . ',"comment":"' . $matches[2][$i] . '"},';
    $result .= $toAdd;
}
$result = substr($result, 0, strlen($result) - 1);
$result = '[' . $result . ']';
echo $result;
1

Вы можете использовать регулярное выражение

\b\d+\b 

для сопоставления чисел в tagId

пример соответствия http://regex101.com/r/xU9aN5/1

ИЛИ

(?<!\()\b\d+\b(?!\))

если комментарий может содержать цифры типа 123(456),789(foo)

  • 0
    а как насчет 123(456),789(foo) ?
  • 0
    @ LucasTrzesniewski Я отредактировал ответ, чтобы включить это также Спасибо за указание
Показать ещё 2 комментария
1

Вот моя попытка:

/(\d+)(?:\([^)]*\))?(?:,|$)/g

Он работает точно так же, как вы предполагали, предполагая, что комментарии не могут быть вложенными и что формат всегда один и тот же.

Вы можете проверить здесь рабочую версию: http://regex101.com/r/rS9sE7/2

Спасибо @LucasTrzesniewsk за то, что я заметил ошибку.

  • 0
    Хорошая работа, легче понять, чем моя. Примечание: если вы хотите, чтобы комментарии были необязательными, добавьте ? вот так: (\d+)(?:\([^)]*\))?(?:,|$)
  • 0
    @LucasTrzesniewski CR * P. Я имел это в виду, но я забыл реализовать. Но хороший улов.
Показать ещё 3 комментария
0

Поскольку для проблемы существует не только одно решение, я представлю еще один ответ.

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

/(?:^|,)(\d+)/g

Он будет соответствовать номерам сразу после начала строки или сразу после комы (char ,).

Вы можете проверить это здесь: http://regex101.com/r/jA5tC3/2

Ещё вопросы

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