2016-12-30 3 views
-1

У меня есть ответ JSON, и я пытаюсь заменить только hypen (-) на подчеркивание (_) на согласованность в PHP, используя preg_replace.PHP Regex to preg_replace hypen с подчеркиванием, если слово имеет двоеточие в конце

Пример;

[ 
    { 
    "name": "Disable Comments", 
    "slug": "disable-comments", 
    "required": true, 
    "force-activation": true, 
    "force-deactivation": true 
    }, 
    { 
    "name": "Intuitive Custom Post Order", 
    "slug": "intuitive-custom-post-order", 
    "required": true, 
    "force-activation": false, 
    "force-deactivation": true 
    } 
] 

Я пытаюсь настроить таргетинг только на ключи, поэтому ничего не заканчивается двоеточием. Я пробовал так много вариаций, но не могу приблизиться.

+2

Просьба указать код, показывающий, что вы пробовали; что поможет вам получить более качественные ответы. – Bek

+5

Я бы разобрал JSON, затем перебрал массивы и заменил ключи, вместо того, чтобы попытаться сделать это прямо в JSON. – Barmar

ответ

-1

Вы можете использовать этот один:

echo preg_replace_callback("/\"([^\"]*)\":/", function($m){ 
    return str_replace("-", "_", $m[0]); 
}, $jsonStr); 
3

Я хотел бы сделать это на расшифрованной массиве, а не на самом формате JSON.

$array = json_decode($json, true); 

foreach ($array as &$subarray) { // Use reference so we can modify the subarray in place 
    foreach ($subarray as $key => $value) { 
     $new_key = str_replace('-', '_', $key); 
     if ($new_key != $key) { 
      $subarray[$new_key] = $value; 
      unset($subarray[$key]); 
     } 
    } 
} 

$json = json_encode($array); 
+0

Спасибо, это тот подход, с которым я столкнулся. Работает отлично! – newObject

+0

Вышеприведенные работы, но не в том случае, если ключи вложены в объект JSON/массив. Я знаю, что это выходит за рамки исходного вопроса, но просто хотел указать на него, если другие найдут этот поток и попытаются использовать его в многомерном массиве. – newObject

+0

Это правда.Было бы относительно просто включить это в функцию и заставить его рекурсивно переходить в подматрицы. – Barmar

0

Для такой небольшой строки JSON может быть излишним, но если вы все же хотите использовать регулярное выражение с пропитанного связующим замены вы можете добиться желаемых результатов с:

preg_replace('/(".*)(-)(.*:\s)/','$1_$3',$json) 

быть $json вы JSON строку.

С указанным регулярным выражением вы захватываете 3 разных группы.

  1. Сначала один (".*), ловит начало ключей элементов до JSON дефисом.
  2. Второй (-), ловит дефис.
  3. Третий (.*:\s), ловит остальную часть ключа до пробела знак после :.

Если эти группы совпадают друг с другом, то они возвращаются на вас, и вы можете использовать каждый матч группы с заполнителями $1, $2, $3. Поскольку вы хотите заменить дефис, просто создайте замену в виде строки из заполнителей $1 и $3, разделенных дефисом.

EDIT: Как отметил @Toto, это не работает для стандартной форматированной строки json, а не для примера, предоставленного OP. Регулярное выражение обновляется будет:

preg_replace('/("[\w]*)(-)([\w]*"[\s]*:)/','$1_$3',$json) 

Я только что изменил первое и третье соответствия группы, чтобы соответствовать любое слово символ с \w ноль или более раз, а в третьей группе согласующего я добавил возможность, чтобы соответствовать любой пробел чтобы иметь возможность сопоставлять форматирование с или без пробелов:

... "force-activation": true, "force-activation" : true, ... 
+0

Вы пробовали его с помощью строки без разломов в ней? – Toto

+0

Нет, я этого не делал. Но я могу отредактировать решение для форматированной json-строки в стандартном формате. – Dez

+0

Спасибо, это тоже работает, и объяснение было действительно полезно! – newObject

 Смежные вопросы

  • Нет связанных вопросов^_^