Строковое разделение в требуемом формате, Pythonic путь? (с или w/o Regex)

Как обсуждалось в комментарии, у вас может быть несколько флажков, формирующих параметр массива: <input name="theName[1]"> с явным ключом и name="theName[]" с неявным ключом.

Более того, вы должны использовать подготовленные операторы для предотвращения атак SQL-инъекций. Представьте, что злоумышленник отправляет запрос с одинарной кавычкой ' в поле, то есть он завершает разделитель строк SQL и добавляет произвольный код SQL. Подготовленные операторы используют заполнители, а параметры отправляются отдельно.

Вы также должны обрабатывать ошибки. В приведенном ниже коде ошибки выводятся в виде HTML, однако вы должны определить свою собственную функцию ведения журнала, а не просто echo в поток. Это может выводить HTML на серверы разработки, но записывать на диск на производственных серверах.

Это рабочий пример, протестированный на PHP7.3 с MariaDB 10:

<!DOCTYPE HTML>
<html lang="de">

<head>
  <meta charset="utf-8">
  <title>ToDo-APP</title>
  <link rel="stylesheet" href="css/Lil-Helper.css">
  <link href="https://fonts.googleapis.com/css?family=Lato" rel="stylesheet">
  <link rel="stylesheet" href="css/webfonts/all.css">
  <link rel="stylesheet" href="css/own.css">
  <style>
    #frm-tasks button
    {
      padding: 0 18px;
    }
  </style>
</head>

<body>

<?php
  mysqli_report(MYSQLI_REPORT_STRICT);
  try
  {
    $con = new mysqli('localhost', 'testuser', 'testpasswd', 'testdb');

    $action = 

Как обсуждалось в комментарии, у вас может быть несколько флажков, формирующих параметр массива: <input name="theName[1]"> с явным ключом и name="theName[]" с неявным ключом.

Более того, вы должны использовать подготовленные операторы для предотвращения атак SQL-инъекций. Представьте, что злоумышленник отправляет запрос с одинарной кавычкой ' в поле, то есть он завершает разделитель строк SQL и добавляет произвольный код SQL. Подготовленные операторы используют заполнители, а параметры отправляются отдельно.

Вы также должны обрабатывать ошибки. В приведенном ниже коде ошибки выводятся в виде HTML, однако вы должны определить свою собственную функцию ведения журнала, а не просто echo в поток. Это может выводить HTML на серверы разработки, но записывать на диск на производственных серверах.

Это рабочий пример, протестированный на PHP7.3 с MariaDB 10:

[110]POST['action'] ?? 'list'; if(!empty(

Как обсуждалось в комментарии, у вас может быть несколько флажков, формирующих параметр массива: <input name="theName[1]"> с явным ключом и name="theName[]" с неявным ключом.

Более того, вы должны использовать подготовленные операторы для предотвращения атак SQL-инъекций. Представьте, что злоумышленник отправляет запрос с одинарной кавычкой ' в поле, то есть он завершает разделитель строк SQL и добавляет произвольный код SQL. Подготовленные операторы используют заполнители, а параметры отправляются отдельно.

Вы также должны обрабатывать ошибки. В приведенном ниже коде ошибки выводятся в виде HTML, однако вы должны определить свою собственную функцию ведения журнала, а не просто echo в поток. Это может выводить HTML на серверы разработки, но записывать на диск на производственных серверах.

Это рабочий пример, протестированный на PHP7.3 с MariaDB 10:

[110]POST["text"])) { $eingabe =

Как обсуждалось в комментарии, у вас может быть несколько флажков, формирующих параметр массива: <input name="theName[1]"> с явным ключом и name="theName[]" с неявным ключом.

Более того, вы должны использовать подготовленные операторы для предотвращения атак SQL-инъекций. Представьте, что злоумышленник отправляет запрос с одинарной кавычкой ' в поле, то есть он завершает разделитель строк SQL и добавляет произвольный код SQL. Подготовленные операторы используют заполнители, а параметры отправляются отдельно.

Вы также должны обрабатывать ошибки. В приведенном ниже коде ошибки выводятся в виде HTML, однако вы должны определить свою собственную функцию ведения журнала, а не просто echo в поток. Это может выводить HTML на серверы разработки, но записывать на диск на производственных серверах.

Это рабочий пример, протестированный на PHP7.3 с MariaDB 10:

[110]POST["text"]; try { $stmt = $con->prepare('INSERT INTO work(text) VALUES(?)'); $stmt->bind_param('s',

Как обсуждалось в комментарии, у вас может быть несколько флажков, формирующих параметр массива: <input name="theName[1]"> с явным ключом и name="theName[]" с неявным ключом.

Более того, вы должны использовать подготовленные операторы для предотвращения атак SQL-инъекций. Представьте, что злоумышленник отправляет запрос с одинарной кавычкой ' в поле, то есть он завершает разделитель строк SQL и добавляет произвольный код SQL. Подготовленные операторы используют заполнители, а параметры отправляются отдельно.

Вы также должны обрабатывать ошибки. В приведенном ниже коде ошибки выводятся в виде HTML, однако вы должны определить свою собственную функцию ведения журнала, а не просто echo в поток. Это может выводить HTML на серверы разработки, но записывать на диск на производственных серверах.

Это рабочий пример, протестированный на PHP7.3 с MariaDB 10:

[110]POST["text"]); $stmt->execute(); } catch (mysqli_sql_exception $e) { $msg = $e->getMessage(); echo "<div>Error processing statement: $msg;</div>"; } } if('del' === $action && isset(

Как обсуждалось в комментарии, у вас может быть несколько флажков, формирующих параметр массива: <input name="theName[1]"> с явным ключом и name="theName[]" с неявным ключом.

Более того, вы должны использовать подготовленные операторы для предотвращения атак SQL-инъекций. Представьте, что злоумышленник отправляет запрос с одинарной кавычкой ' в поле, то есть он завершает разделитель строк SQL и добавляет произвольный код SQL. Подготовленные операторы используют заполнители, а параметры отправляются отдельно.

Вы также должны обрабатывать ошибки. В приведенном ниже коде ошибки выводятся в виде HTML, однако вы должны определить свою собственную функцию ведения журнала, а не просто echo в поток. Это может выводить HTML на серверы разработки, но записывать на диск на производственных серверах.

Это рабочий пример, протестированный на PHP7.3 с MariaDB 10:

[110]POST['rows']) && is_array(

Как обсуждалось в комментарии, у вас может быть несколько флажков, формирующих параметр массива: <input name="theName[1]"> с явным ключом и name="theName[]" с неявным ключом.

Более того, вы должны использовать подготовленные операторы для предотвращения атак SQL-инъекций. Представьте, что злоумышленник отправляет запрос с одинарной кавычкой ' в поле, то есть он завершает разделитель строк SQL и добавляет произвольный код SQL. Подготовленные операторы используют заполнители, а параметры отправляются отдельно.

Вы также должны обрабатывать ошибки. В приведенном ниже коде ошибки выводятся в виде HTML, однако вы должны определить свою собственную функцию ведения журнала, а не просто echo в поток. Это может выводить HTML на серверы разработки, но записывать на диск на производственных серверах.

Это рабочий пример, протестированный на PHP7.3 с MariaDB 10:

[110]POST['rows'])) { try{ $stmt = $con->prepare('DELETE FROM `work` WHERE `work`.`id` = ?'); $stmt->bind_param('i', $row); foreach (

Как обсуждалось в комментарии, у вас может быть несколько флажков, формирующих параметр массива: <input name="theName[1]"> с явным ключом и name="theName[]" с неявным ключом.

Более того, вы должны использовать подготовленные операторы для предотвращения атак SQL-инъекций. Представьте, что злоумышленник отправляет запрос с одинарной кавычкой ' в поле, то есть он завершает разделитель строк SQL и добавляет произвольный код SQL. Подготовленные операторы используют заполнители, а параметры отправляются отдельно.

Вы также должны обрабатывать ошибки. В приведенном ниже коде ошибки выводятся в виде HTML, однако вы должны определить свою собственную функцию ведения журнала, а не просто echo в поток. Это может выводить HTML на серверы разработки, но записывать на диск на производственных серверах.

Это рабочий пример, протестированный на PHP7.3 с MariaDB 10:

[110]POST['rows'] as $row) { $stmt->execute(); if($e = $stmt->error) echo "<div>DB Error: $e</div>"; } } catch (mysqli_sql_exception $e) { $msg = $e->getMessage(); echo "<div>Error processing statement: $msg;</div>"; } } ?> <header class="lil-menu lil-flex lil-flex-center align-center"> <a href="index.html" class="lil-brand"> <h3>To-Do</h3> </a> <a class="lil-menu-item currentLink" href="index.html">ToDo</a> <a class="lil-menu-item" href="#archive">Archiv</a> <a class="lil-menu-item" href="#Sprachen">Sprachen</a> </header> <div class="main"> <div class="lil-box"> <h3 class="lil-font-rot lil-big-font lil-space lil-font-style" style="font-size: 4rem;">ToDo</h3> <div class="lil-box"> <!--form action="index.php" method="post"--> <form id="frm-tasks" action="" method="post"> <input class="lil-input" name="text" type="text"> <button type="submit" class="lil-button-green" name="action" value="add">Hinzufügen</button> <?php try { $res = $con->query('SELECT id, text FROM work'); if(0 < $res->num_rows) { ?> <table> <thead> <tr> <th></th><th>ID</th> <th>Aufgabe</th> </tr> </thead> <tbody> <?php while($dsatz = mysqli_fetch_object($res)) { ?> <tr> <td><input type="checkbox" name="rows[]" value="<?php echo $dsatz->id;?>"></td><td><?php echo $dsatz->id;?></td> <td><?php echo $dsatz->text;?></td> </tr> <?php } ?> </tbody> </table> <button type="submit" class="lil-button-red lil-button-small" name="action" value="del">Löschen</button> <?php } } catch (mysqli_sql_exception $e) { $msg = $e->getMessage(); echo "<div>Error processing statement: $e->msg;</div>"; } ?> </form> </div> </div> </div> <!-- not needed atm script src="js/jquery-3.3.1.min.js"></script--> <h2>POST</h2> <?php var_dump(

Как обсуждалось в комментарии, у вас может быть несколько флажков, формирующих параметр массива: <input name="theName[1]"> с явным ключом и name="theName[]" с неявным ключом.

Более того, вы должны использовать подготовленные операторы для предотвращения атак SQL-инъекций. Представьте, что злоумышленник отправляет запрос с одинарной кавычкой ' в поле, то есть он завершает разделитель строк SQL и добавляет произвольный код SQL. Подготовленные операторы используют заполнители, а параметры отправляются отдельно.

Вы также должны обрабатывать ошибки. В приведенном ниже коде ошибки выводятся в виде HTML, однако вы должны определить свою собственную функцию ведения журнала, а не просто echo в поток. Это может выводить HTML на серверы разработки, но записывать на диск на производственных серверах.

Это рабочий пример, протестированный на PHP7.3 с MariaDB 10:

[110]POST); } catch (mysqli_sql_exception $e) { $msg = $e->getMessage(); echo "<div>Error connecting DB: $msg;</div>"; } ?> </body> </html>
6
задан S.Lott 17 February 2009 в 19:12
поделиться

7 ответов

Создание нагло на усилии MrTopf:

import re
rx = re.compile("((?:@\w+ +)+)(.*)")
t='@abc   @def  @xyz Hello this part is text and my email is foo@ba.r'
a,s = rx.match(t).groups()
l = re.split('[@ ]+',a)[1:-1]
print l
print s

печать:

['abc', 'определение', 'xyz']
Привет эта часть является текстом, и моим электронным письмом является foo@ba.r


Справедливо привлеченный к ответу hasen j, позвольте мне разъяснить, как это работает:

/@\w+ +/

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

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

/(@\w+ +)+/

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

/(?:@\w+ +)+/

Наконец, мы превращаем это в группу получения и добавляем другого для подметания остальных:

/((?:@\w+ +)+)(.*)/

Последняя разбивка, которая подведет итог:

((?:@\w+ +)+)(.*)
 (?:@\w+ +)+
 (  @\w+ +)
    @\w+ +

Обратите внимание, что в рассмотрении этого, я улучшился, это - \w не должно было быть в наборе, и это теперь допускает несколько пробелов между тегами. Спасибо, hasen-j!

13
ответ дан 8 December 2019 в 02:35
поделиться
 [i.strip('@') for i in t.split(' ', 2)[:2]]     # for a fixed number of @def
 a = [i.strip('@') for i in t.split(' ') if i.startswith('@')]
 s = ' '.join(i for i in t.split(' ') if not i.startwith('@'))
3
ответ дан 8 December 2019 в 02:35
поделиться

Как насчет этого:

  1. Разделение пространством.
  2. слово foreach, проверить

    2.1. если слово запускается с затем Нажатие для первого списка

    2.2. иначе просто присоединитесь к остающимся словам пробелами.

5
ответ дан 8 December 2019 в 02:35
поделиться

[редактирование: это реализует то, что было предложено Osama выше]

Это создаст L на основе переменные с начала строки, и затем однажды не, var найден, просто захватите остальную часть строки.

t = '@one @two @three some text   afterward with @ symbols@ meow@meow'

words = t.split(' ')         # split into list of words based on spaces
L = []
s = ''
for i in range(len(words)):  # go through each word
    word = words[i]
    if word[0] == '@':       # grab @'s from beginning of string
        L.append(word[1:])
        continue
    s = ' '.join(words[i:])  # put spaces back in
    break                    # you can ignore the rest of the words

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

3
ответ дан 8 December 2019 в 02:35
поделиться
t='@abc @def Hello this part is text'

words = t.split(' ')

names = []
while words:
    w = words.pop(0)
    if w.startswith('@'):
        names.append(w[1:])
    else:
        break

text = ' '.join(words)

print names
print text
7
ответ дан 8 December 2019 в 02:35
поделиться

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

import re
rx = re.compile("@([\w]+) @([\w]+) (.*)")
t='@abc @def Hello this part is text and my email is foo@ba.r'
a,b,s = rx.match(t).groups()

Но это все зависит от того, как Ваши данные могут быть похожими. Таким образом, Вы, возможно, должны были бы скорректировать его. То, что это делает, в основном создает группу через () и проверяет на то, что позволяется в них.

3
ответ дан 8 December 2019 в 02:35
поделиться

Вот просто другое изменение, которое использует разделение () и никакой regexpes:

t='@abc @def My email is red@hjk.com'
tags = []
words = iter(t.split())

# iterate over words until first non-tag word
for w in words:
  if not w.startswith("@"):
    # join this word and all the following
    s = w + " " + (" ".join(words))
    break
  tags.append(w[1:])
else:
  s = "" # handle string with only tags

print tags, s

Вот более короткое, но возможно немного загадочная версия, которая использует regexp для нахождения первого пространства сопровождаемым символом non-@:

import re
t = '@abc @def My email is red@hjk.com @extra bye'
m = re.search(r"\s([^@].*)$", t)
tags = [tag[1:] for tag in t[:m.start()].split()]
s = m.group(1)
print tags, s # ['abc', 'def'] My email is red@hjk.com @extra bye

Это не работает правильно, при отсутствии тегов или никакого текста. Формат является underspecified. Необходимо будет обеспечить больше тестовых сценариев для проверки.

1
ответ дан 8 December 2019 в 02:35
поделиться
Другие вопросы по тегам:

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