PHP 5.3, регулярное выражение для получения конкретных данных из строки на основе предыдущего текста и <br> - PullRequest
1 голос
/ 20 июня 2010

У меня есть следующий пример строки:

PASSWORD = dsl3£$Roid
dfdfdf
fgdgfdfg
fgdfgdfg
dfgdfg
dfgdfgdfg

хранится в текстовом поле MySql.

Мне нужно получить «пароль», т.е. dsl3 £ $ Roid

Ему предшествует ПАРОЛЬ =, а после \ n перенос строки.Я могу использовать nl2br, чтобы сделать строку, подобную этой:

PASSWORD = dsl3£$Roid<br>
dfdfdf<br>
fgdgfdfg<br>
fgdfgdfg<br>
dfgdfg<br>
dfgdfgdfg<br>

Я боролся с preg_match весь день, но не повезло ... В настоящее время есть 10k + строк, каждая с уникальными паролями и нужен какой-то код, чтобы вытащить толькопароль.

Большое спасибо за помощь!

Ответы [ 4 ]

2 голосов
/ 20 июня 2010

Не так сложно.

/PASSWORD\s=\s(?P<PASSWORD>[^\n]+)?\n/msU

совпадение будет содержать «ПАРОЛЬ», если оно найдено в тексте:

$text = YOUR_BLOB_HERE;

$match = array();
$count = preg_match('/PASSWORD\s=\s(?P<PASSWORD>[^\n]+)?\n/msU', $text, $match);

print_r($match);

/*  output:

Array
(
    [0] => PASSWORD = dsl3£$Roid

    [PASSWORD] => dsl3£$Roid
    [1] => dsl3£$Roid
)

*/
1 голос
/ 20 июня 2010

Это можно сделать полностью с MySQL:

SELECT SUBSTR(field, LOCATE('= ', field) + 2, LOCATE('\n', field) - LOCATE('= ', field) - 2) AS password FROM table;

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

CREATE VIEW table2 AS SELECT *, SUBSTR(field, LOCATE('= ', field) + 2, LOCATE('\n', field) - LOCATE('= ', field) - 2) AS password FROM table;

Теперь вы можете SELECT password FROM table2; получить поле непосредственно

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

1 голос
/ 20 июня 2010

Не использовать nl2br;это не нужно.

$string = ...;
preg_match('/^PASSWORD = (.*)$/m', $string, $matches);

Результат будет в $matches[1].Это позволит ввести пароль в любой строке.Если вы хотите сопоставить его только в первой строке, выполните:

preg_match('/^PASSWORD = (.*)/', $string, $matches);

См. preg_match и значение модификаторов .

0 голосов
/ 20 июня 2010

К сведению, рабочий код:

$match = array();
preg_match('/PASSWORD\s=\s(?P<PASSWORD>[^\n]+)?\n/msU', $password_dirty, $match);
$password = $match[1];

Недостающая часть, очевидно, должна была объявить $ match как массив в начале.

...