Regex находит многострочные комментарии C ++, используя Notepad ++ [duplicate]

Intro

Сначала у вас есть строка. JSON не является массивом, объектом или структурой данных. JSON - текстовый формат сериализации - так что причудливая строка, но все же просто строка. Декодируйте его в PHP с помощью json_decode() .

 $data = json_decode($json);

В нем вы можете найти:

Это то, что может быть закодировано в JSON. Или, точнее, это версии PHP, которые могут быть закодированы в JSON.

В них нет ничего особенного. Они не являются объектами JSON или массивами JSON. Вы расшифровали JSON - теперь у вас есть основные повседневные типы PHP .

Объекты будут экземплярами stdClass , встроенным классом, который просто generic thing , что здесь не важно.


Доступ к свойствам объекта

Вы получаете доступ к свойствам одного из этих объектов так же, как и для публичных нестатических свойств любого другого объекта, например $object->property.

$json = '
{
    "type": "donut",
    "name": "Cake"
}';

$yummy = json_decode($json);

echo $yummy->type; //donut

Доступ к элементам массива

Доступ к элементам одного из этих массивов осуществляется так же, как и для любого другой массив, например $array[0] .

$json = '
[
    "Glazed",
    "Chocolate with Sprinkles",
    "Maple"
]';

$toppings = json_decode($json);

echo $toppings[1]; //Chocolate with Sprinkles

Итерации над ним с помощью foreach .

foreach ($toppings as $topping) {
    echo $topping, "\n";
}

Глазурованный Шоколад с спринклерами Maple

blockquote>

Или беспорядок с любой из встроенных функций bazillion [].


Доступ к вложенные элементы

Свойства объектов и элементов массивов могут быть больше объектов и / или массивов - вы можете просто продолжать доступ к своим свойствам и членам как обычно, например $object->array[0]->etc.

$json = '
{
    "type": "donut",
    "name": "Cake",
    "toppings": [
        { "id": "5002", "type": "Glazed" },
        { "id": "5006", "type": "Chocolate with Sprinkles" },
        { "id": "5004", "type": "Maple" }
    ]
}';

$yummy = json_decode($json);

echo $yummy->toppings[2]->id; //5004

Передача true в качестве второго аргумента в json_decode ()

Когда вы это сделаете, вместо объектов вы получите ассоциативные массивы - массивы со строками для ключей. Снова вы получаете доступ к их элементам, как обычно, например. $array['key'].

$json = '
{
    "type": "donut",
    "name": "Cake",
    "toppings": [
        { "id": "5002", "type": "Glazed" },
        { "id": "5006", "type": "Chocolate with Sprinkles" },
        { "id": "5004", "type": "Maple" }
    ]
}';

$yummy = json_decode($json, true);

echo $yummy['toppings'][2]['type']; //Maple

Не знаю, как структурированы данные

Прочитайте документацию, независимо от того, получение JSON из.

Посмотрите на JSON - где вы видите фигурные скобки {}, ожидайте объект, где вы видите квадратные скобки [], ожидаете массив.

Нажмите декодированные данные с помощью print_r() :

$json = '
{
    "type": "donut",
    "name": "Cake",
    "toppings": [
        { "id": "5002", "type": "Glazed" },
        { "id": "5006", "type": "Chocolate with Sprinkles" },
        { "id": "5004", "type": "Maple" }
    ]
}';

$yummy = json_decode($json);

print_r($yummy);

и проверьте вывод:

stdClass Object
(
    [type] => donut
    [name] => Cake
    [toppings] => Array
        (
            [0] => stdClass Object
                (
                    [id] => 5002
                    [type] => Glazed
                )

            [1] => stdClass Object
                (
                    [id] => 5006
                    [type] => Chocolate with Sprinkles
                )

            [2] => stdClass Object
                (
                    [id] => 5004
                    [type] => Maple
                )

        )

)

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

Если вы можете только дойти до него до того, как потеряетесь, зайдите так далеко и нажмите , что с print_r():

print_r($yummy->toppings[0]);
stdClass Object
(
    [id] => 5002
    [type] => Glazed
)

Разбить проблему на части, которые легче обернуть вокруг головы.


json_decode() возвращает null

Это происходит потому, что либо:

  1. JSON полностью состоит именно из этого, null.
  2. JSON is недействителен - проверьте результат json_last_error_msg или введите его через JSONLi nt .
  3. Он содержит элементы, вложенные в глубину более 512 уровней. Эта максимальная глубина по умолчанию может быть переопределена путем передачи целого числа в качестве третьего аргумента в json_decode() .

Если вам нужно изменить максимальную глубину, вы, вероятно, решение неправильной проблемы. Узнайте, почему вы получаете такие глубоко вложенные данные (например, у службы, к которой вы обращаетесь, у которой возникает JSON, есть ошибка) и получить это, чтобы этого не произошло.


Имя свойства объекта содержит специальный символ

Иногда у вас будет имя свойства объекта, которое содержит нечто вроде дефиса - или знака @, которое не может использоваться в литеральном идентификаторе. Вместо этого вы можете использовать строковый литерал в фигурных скобках для его адресации.

$json = '{"@attributes":{"answer":42}}';
$thing = json_decode($json);

echo $thing->{'@attributes'}->answer; //42

Если у вас есть свойство integer as: Как получить доступ к свойствам объекта с именами типа целых чисел? как ссылка.


Кто-то поставил JSON в ваш JSON

Это смешно, но это происходит - JSON закодирован как строка в вашем JSON. Декодирование, доступ к строке как обычно, декодирование , которое , и, в конечном счете, доступ к тому, что вам нужно.

$json = '
{
    "type": "donut",
    "name": "Cake",
    "toppings": "[{ \"type\": \"Glazed\" }, { \"type\": \"Maple\" }]"
}';

$yummy = json_decode($json);
$toppings = json_decode($yummy->toppings);

echo $toppings[0]->type; //Glazed

Данные не помещаются в память

Если ваш JSON слишком большой для json_decode(), чтобы обрабатывать сразу, все начинает становиться сложным. См. Также:


Как отсортировать его

См.: Ссылка: все основные способы сортировки массивов и данных в PHP .

14
задан Alan Moore 23 April 2013 в 11:27
поделиться

5 ответов

Попробуйте использовать это регулярное выражение (только для одиночных строк):

String src ="How are things today /* this is comment */ and is your code /* this is another comment */ working?";
String result=src.replaceAll("/\\*.*?\\*/","");//single line comments
System.out.println(result);

REGEX объяснено:

Соответствует символу «/» буквально

Соответствует символу "*" буквально

"." Сопоставьте любой отдельный символ

"*?" Между нулевым и неограниченным временными интервалами, как можно меньше, расширяя по мере необходимости (lazy)

Соответствует символу «*» буквально

Соответствует символу «/» буквально

Альтернативно это регулярное выражение для одиночных и многострочных комментариев, добавив (? s) :

//note the added \n which wont work with previous regex
String src ="How are things today /* this\n is comment */ and is your code /* this is another comment */ working?";
String result=src.replaceAll("(?s)/\\*.*?\\*/","");
System.out.println(result);

Ссылка:

11
ответ дан ThomasW 21 August 2018 в 20:30
поделиться
  • 1
    Это будет весело, если у вас есть строка, содержащая последовательности комментариев. – nhahtdh 22 October 2012 в 16:59
  • 2
    Можете ли вы объяснить, как работает многострочное регулярное выражение? Я не понимаю (? S) (и ссылка в этом не помогает). – brimborium 22 October 2012 в 17:01
  • 3
    @nhahtdh +1 Lol да еще одна история полностью (я думаю, вы просто проверяете String раньше для любой последовательности символов и заменяете их чем-то безопасным до тех пор, пока regex не будет закончен, а затем замените их обратно? – David Kroukamp 22 October 2012 в 17:01
  • 4
    @brimborium: (?s) - DOTALL, что означает, что . будет соответствовать даже новому символу строки (который по умолчанию не будет соответствовать). – nhahtdh 22 October 2012 в 17:02
  • 5
    @DavidKroukamp благодарит, что решил запрос ... – hanumant 22 October 2012 в 17:06

Попробуйте следующее:

(//[^\n]*$|/(?!\\)\*[\s\S]*?\*(?!\\)/)

Если вы хотите исключить части, заключенные в "", используйте:

(\"[^\"]*\"(?!\\))|(//[^\n]*$|/(?!\\)\*[\s\S]*?\*(?!\\)/)

первая группа захвата идентифицирует все "" части и вторая группа захвата дает вам комментарии (как для одной строки, так и для нескольких строк)

скопируйте регулярное выражение в regex101 , если вы хотите пояснить

1
ответ дан ak13 21 August 2018 в 20:30
поделиться

Попробуйте это, что сработало для меня:

System.out.println(src.replaceAll("(\/\*.*?\*\/)+",""));
0
ответ дан Digerkam 21 August 2018 в 20:30
поделиться
System.out.println(src.replaceAll("\\/\\*.*?\\*\\/ ?", ""));

Вы должны использовать не-жадный квантификатор? чтобы заставить регулярное выражение работать. Я также добавил '?' в конце регулярного выражения, чтобы удалить одно пространство.

0
ответ дан jens-na 21 August 2018 в 20:30
поделиться

Лучшее многострочное выражение regex комментариев - это развернутая версия (?s)/\*.*?\*/, которая выглядит как

String pat = "/\\*+[^*]*\\*+(?:[^/*][^*]*\\*+)*/";

См. пояснение в regex101.com .

Короче говоря,

  • /\*+ - сопоставить начало комментария, /* и любые звездочки 0+ после него
  • [^*]*\*+ - сопоставить 0+ символов, кроме *, за которыми следуют 1+ литеральные *
  • (?:[^/*][^*]*\*+)* - 0+ последовательности из: [^/*][^*]*\*+ - не / или * (совпадающие с [^/*]), за которым следуют символы 0 + не звездочки ([^*]*), за которыми следуют звездочки 1+ (\*+)
  • / - закрытие /

regex Дэвида требует 26 шагов , чтобы найти совпадение в моей строке примера, а моему регулярному выражению требуется только 12 шагов . С огромными входами, регулярное выражение Дэвида, скорее всего, потерпит неудачу с проблемой переполнения стека или что-то подобное, потому что совпадение .*? ленивых точек неэффективно из-за ленивого расширения шаблона в каждом месте, которое выполняет механизм регулярных выражений, в то время как мой шаблон соответствует линейным фрагментам текста в один раз.

19
ответ дан Wiktor Stribiżew 21 August 2018 в 20:30
поделиться
  • 1
    Как вы пришли к этому? – AT-Aoi 7 October 2017 в 14:15
  • 2
    @ AT-Aoi В основном это взято из раздела Освоение регулярных выражений , Удаление комментариев C . – Wiktor Stribiżew 7 October 2017 в 14:21
Другие вопросы по тегам:

Похожие вопросы: