从bbCode标记中提取ID号并从数据库中检索数据

时间:2017-10-26 15:37:06

标签: php regex foreach

在以下测试字符串中,我有2 [image id=""]

$string = 'This is a regular test string with [image id="1"] within this sentence. The next sentence (this one) will contain another bbCode tag, [image id="3"].';

我想借助regex提取这些bbCodes中的数字。

preg_match_all('~\[image id=(.+?)]~', $string, $results);
foreach($results AS $dataish) {
    echo filter_var($dataish[1], FILTER_SANITIZE_NUMBER_INT);
}

上面的代码会提取数字,但不是13,而是打印出33。如果我写$dataish[0]而不是$dataish[0],则会打印出11

目的:我想获取image标记内的ID,以便能够从数据库中显示正确的图像。 [image id="1"]将显示网站上数据库中ID为1的图像(当然还有用图像替换bbCode)。

请注意,该字符串也只能包含1个[image id=""]。并不总是它包含多个bbCode。

我该如何做到这一点?

3 个答案:

答案 0 :(得分:3)

foreach($results AS $dataish){
    $thenumber = filter_var($dataish[1], FILTER_SANITIZE_NUMBER_INT);
}
echo $thenumber;

问题是因为$ results数组有2个值(1和3)当你为它做foreach时,它想要打印两个但是你告诉它只打印$dataish[1]; 所以它打印相同的值2次,

解决方案将输出设置为$ thenumber并在}(endforeach)之后打印

我希望这可以帮助你:)。

<强> EDITED

这是另一个解决方案@Erik:)

preg_match_all('~\[image id=(.+?)]~', $string, $results);
for($i=0;$i<sizeof($results);$i++){
    echo filter_var($results[0][$i], FILTER_SANITIZE_NUMBER_INT);
}

此解决方案,如果您想要打印多个输出。

答案 1 :(得分:1)

更改正则表达式模式,如下所示:

Array
(
    [0] => 1
    [1] => 3
)

输出:

class Special extends React.Component {
    state = {
        speciallist: [],
    }
    checkFav(i) {
        const {
            speciallist
        } = this.state;
        const newList = speciallist.slice()[i]['isFav'] = true;
        this.setState = {
            speciallist: newList
        }
    }
    renderSpecialItem = () => {
        const {
            speciallist
        } = this.state;

        return speciallist.map((item, i) => {
            return (
                <SpecialItem key={i} isfavourite={item.isFav} onPress={this.checkFav.bind(this, i)}/>
            );
        });
    }
}

答案 2 :(得分:1)

我想你想把你的正则表达式改成这样的东西:

import { DateAdapter, NativeDateAdapter } from '@angular/material';

@Component({
    selector: 'foo',
    template: ''
})
export class FooComponent {
    constructor(dateAdapter: DateAdapter<NativeDateAdapter>) {
        dateAdapter.setLocale('de-DE');
    }
}

您可以在右侧看到我的测试here及其解释