Нужна помощь в составлении регулярного выражения?

Есть строка
string|name1,value1|name2,value2|name3,value3|...


Очень хочется составить одно регулярное выражение, чтобы можно было вытащить все нужные значения: string, name1, value1, name2, value2, name3, value3 и так далее. Очень хочется составить его самостоятельно, но не получается.


string — может быть более сложным выражением, которое надо будет разбирать в том же регулярном выражении.

UPD. Примером может служить адрес, например, такой: www.google.ru/?sclient=psy-ab&hl=ru&safe=off&sourc...

где string это www.google.ru/? ну и остальные параметры. Регулярка нужна, чтобы можно было передать в качестве аргумента.
  • Вопрос задан
  • 2554 просмотра
Пригласить эксперта
Ответы на вопрос 7
deadkrolik
@deadkrolik
$a = "string|name1,value1|name2,value2|name3,value3|...";
preg_match_all("/([^|,]+)/",$a,$matches);
var_dump($matches);
Ответ написан
Комментировать
Stdit
@Stdit
preg_match_all("~([^|,]+)\|([^,]+)~","string|name1,value1|name2,value2|name3",$m);var_dump($m);

  [1]=>
  array(3) {
    [0]=>
    string(6) "string"
    [1]=>
    string(6) "value1"
    [2]=>
    string(6) "value2"
  }
  [2]=>
  array(3) {
    [0]=>
    string(5) "name1"
    [1]=>
    string(5) "name2"
    [2]=>
    string(5) "name3"
  }
Ответ написан
pel
@pel
Регулярка вам нужна только чтоб меньше кода было? Может, обойтись без них?

<?php

$s = 'string|name1,value1|name2,value2|name3,value3';
$b = array();

foreach( explode('|', $s) AS $e ) {
	list($k, $v) = explode(',', $e);
	$b[$k] = $v;
}

?>

$b: Array
(
    [string] => 
    [name1] => value1
    [name2] => value2
    [name3] => value3
)


Только про «string» не совсем понятно, что вы имели в виду… Можно пример?
Ответ написан
theRavel
@theRavel
// Вот регулярка вашей мечты:
$pattern = '/^(?<prefix>\w+)|(?<names>\w+),(?<values>\w+)/i';
$value = 'string|name1,value1|name2,value2';
preg_match_all($pattern, $value, $matches);
var_dump($matches);

// Можно почистить лишние матчеры
array_walk($matches, function(&$item, $key) use (&$matches) {
   if (is_numeric($key)) {
      unset($matches[$key]);
      return;
   }
   foreach ($item as $key => $match) {
      if (empty($match)) {
         unset($item[$key]);
      }
   }
});
var_dump($matches);
Ответ написан
Kuzma
@Kuzma
Не уверен, что правильно понял задачу. Формулировка уж больно запутанная

<?php
$string = 'string|name1,value1|name2,value2|name3,value3';
$regexp = '/[a-zA-Z0-9]+/';
preg_match_all($regexp,$string,$matches);
var_dump($matches);
Ответ написан
Комментировать
@the_ghost
А как на счет word boundary - \b?

ideone.com/w5cgt

<?
$str = 'string|name1,value1|name2,value2|name3,value3|';
preg_match_all('#\b(\w+)\b#', $str, $matches);
var_dump($matches);
?>


[0] => Array
(
[0] => string
[1] => name1
[2] => value1
[3] => name2
[4] => value2
[5] => name3
[6] => value3
)
Ответ написан
Комментировать
@janitor
Веб-разаботчик
(\w+)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы