Как regex может проигнорировать завершенные кавычки когда соответствующие строки?

Не стесняйтесь пропустить этот ответ, если хотите решить проблему с сертификатами. Этот ответ касается туннелирования ssh через брандмауэр, который, на мой взгляд, является лучшим решением для работы с брандмауэрами / прокси-серверами.

Существует лучший способ, чем использование доступа по протоколу http, а именно использование службы ssh, предлагаемой github на порту 443 сервера ssh.github.com.

Мы используем инструмент под названием штопор. Это доступно как для CygWin (через настройку с домашней страницы cygwin), так и для Linux с использованием вашего любимого инструмента упаковки. Для MacOSX это доступно из macports и варится по крайней мере.

Командная строка выглядит следующим образом:

$ corkscrew     

Proxyhost и proxyport - это координаты прокси https. Targethost и targetport - это местоположение хоста для туннелирования. Authfile представляет собой текстовый файл с 1 строкой, содержащей имя пользователя и пароль прокси-сервера, разделенные двоеточием

, например:

abc:very_secret

Установка для использования «обычного» протокола ssh для связи git

Добавив это в ~/.ssh/config, этот трюк можно использовать для обычных соединений ssh.

Host github.com
  HostName ssh.github.com
  Port 443
  User git
  ProxyCommand corkscrew   %h %p ~/.ssh/proxy_auth

Теперь вы можете проверить его работоспособность, выполнив команду ssh-ging для gitproxy

pti@pti-laptop:~$ ssh github.com
PTY allocation request failed on channel 0
Hi ptillemans! You've successfully authenticated, but GitHub does not provide shell access.
       Connection to github.com closed.
pti@pti-laptop:~$

(Примечание: если вы никогда ранее не входили в github, ssh попросит добавить ключ сервера в файл известных хостов. Если вы параноик, рекомендуется проверить отпечаток RSA на тот, который указан на сайте github, куда вы загрузили свой ключ).

Небольшой вариант этого метода - это случай, когда вам нужен доступ к хранилищу с другим ключом, например, отделить вашу личную учетную запись от вашей профессиональной учетной записи.

# 
# account dedicated for the ACME private github account 
#
Host acme.github.com
  User git
  HostName ssh.github.com
  Port 443
  ProxyCommand corkscrew  <3128> %h %p ~/.ssh/proxy_auth
  IdentityFile ~/.ssh/id_dsa_acme

наслаждайтесь!

Мы используем его уже много лет как на Linux, Mac, так и на Windows.

Если вы хотите, вы можете узнать больше об этом в этом блоге

5
задан JMTyler 29 June 2009 в 21:17
поделиться

5 ответов

<?php
$backslash = '\\';

$pattern = <<< PATTERN
#(["'])(?:{$backslash}{$backslash}?+.)*?{$backslash}1#
PATTERN;

foreach(array(
    "<?php \$s = 'Hi everyone, we\\'re ready now.'; ?>",
    '<?php $s = "Hi everyone, we\\"re ready now."; ?>',
    "xyz'a\\'bc\\d'123",
    "x = 'My string ends with with a backslash\\\\';"
    ) as $subject) {
        preg_match($pattern, $subject, $matches);
        echo $subject , ' => ', $matches[0], "\n\n";
}

печатает

<?php $s = 'Hi everyone, we\'re ready now.'; ?> => 'Hi everyone, we\'re ready now.'

<?php $s = "Hi everyone, we\"re ready now."; ?> => "Hi everyone, we\"re ready now."

xyz'a\'bc\d'123 => 'a\'bc\d'

x = 'My string ends with with a backslash\\'; => 'My string ends with with a backslash\\'
3
ответ дан 14 December 2019 в 04:45
поделиться

Вот мое решение с тестовыми примерами:

/.*?'((?:\\\\|\\'|[^'])*+)'/

И мое (Perl, но я не использую никаких специфичных для Perl функций, о которых я не думаю) доказательство:

use strict;
use warnings;

my %tests = ();
$tests{'Case 1'} = <<'EOF';
$var = 'My string';
EOF

$tests{'Case 2'} = <<'EOF';
$var = 'My string has it\'s challenges';
EOF

$tests{'Case 3'} = <<'EOF';
$var = 'My string ends with a backslash\\';
EOF

foreach my $key (sort (keys %tests)) {
    print "$key...\n";
    if ($tests{$key} =~ m/.*?'((?:\\\\|\\'|[^'])*+)'/) {
        print " ... '$1'\n";
    } else {
        print " ... NO MATCH\n";
    }
}

Запуск этого показывает :

$ perl a.pl
Case 1...
 ... 'My string'
Case 2...
 ... 'My string has it\'s challenges'
Case 3...
 ... 'My string ends with a backslash\\'

Обратите внимание, что начальный подстановочный знак в начале не должен быть жадным. Затем я использую совпадения без возврата, чтобы проглотить \\ и \ ', а затем все остальное, что не является автономным символом кавычек.

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

3
ответ дан 14 December 2019 в 04:45
поделиться
/.*'([^'\\]|\\.)*'.*/

Часть в скобках ищет символы без апострофов / обратной косой черты и символы с экранированием обратной косой черты. Если можно экранировать только определенные символы, измените \\. на \\ ['\\ az] или как там.

2
ответ дан 14 December 2019 в 04:45
поделиться

Посредством отрицательного просмотра:

/
.*?'              #Match until '
(
 .*?              #Lazy match & capture of everything after the first apostrophe
)    
(?<!(?<!\\)\\)'   #Match first apostrophe that isn't preceded by \, but accept \\
.*                #Match remaining text
/
0
ответ дан 14 December 2019 в 04:45
поделиться
Regex reg = new Regex("(?<!\\\\)'(?<string>.*?)(?<!\\\\)'");
0
ответ дан 14 December 2019 в 04:45
поделиться
Другие вопросы по тегам:

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